線段樹區間染色 注意事項

2021-08-31 16:39:03 字數 1186 閱讀 9631

具體思路:用線段樹儲存每個區間的顏色,然後再打乙個染色的標記,注意最後統計的時候,相鄰區間的不注意的話會被算成兩種。如果按照我一開始的思路的打,(1,4)這個區間,(5,8)這個區間,如果(1,4)的顏色和(5,7)的顏色相同,但是如果(5,8)是乙個混色的時候,這個時候會被統計成兩個顏色,其實是只有一種顏色,這個地方注意下。

ac**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

# define inf 0x3f3f3f3f

# define ll long long

# define maxn 5000000+1000

# define lson l,m,rt<<1

# define rson m+1,r,rt<<1|1

int a[maxn];

int col[maxn];

mapq;

int ans[maxn];

int t;

void up(int rt)

if(a[rt<<1]!=a[rt<<1|1])

a[rt]=a[rt<<1];

col[rt]=1;

}void down(int rt)

}void update(int l,int r,int p,int l,int r,int rt)

down(rt);

int m=(l+r)>>1;

if(l<=m)update(l,r,p,lson);

if(r>m)update(l,r,p,rson);

up(rt);

}void query(int l,int r,int rt)

down(rt);

int m=(l+r)>>1;

query(lson);

query(rson);

}int main()

query(1,8010,1);

q[ans[1]]++;

int num=0;

for(int i=2; i<=t; i++)

}for(int i=0; i<=8001; i++)

}printf("\n");

}return 0;

}

線段樹注意事項

1.所有的乘除法都用位運算,速度快,而且好像可以防wrong answer 2.樹的大小開maxn的四倍,即maxn 2 3.如果範圍是 0,n 1 子節點為2 root 1和2 root 2 如果範圍是 1,n 子節點為root 1和root 1 1 4.區間更新時,節點表示範圍內的總和,和表示範...

ZOJ 1610 線段樹區間染色

給長度8000公尺的板,對其中區間染色,問最後能看到的顏色,和該顏色一共出現了幾段 線段覆蓋法 資料比較水 也可以暴力水過 線段樹 include stdio.h include string.h struct node data 40010 int color 8011 void build in...

區間染色 kuagnbin線段樹專題(3)

hdu 1698 just a hook p2161 shoi2009 會場預約 本來是把區間染色放到第一次總結的,但是後來才發現自己對區間染色並沒有那麼熟練,所以特意提取出來總結一遍。區間染色的查詢主要有兩種 一種是直接詢問 l,r 之間的顏色種類,還有就是對每個顏色有一定的權值,求 l,r 之前...