/*
之前的思想是用回溯的方式進行顏色的更新的!如果用回溯的方法的話,就是將每乙個節點的顏色都要更新
通過子節點的顏色情況來判斷父節點的顏色情況 !這就是tle的原因!
後來想一想沒有必要 !加入[a, b] 區間有p管轄,那麼tree[p]的顏色值就是[a, b]所有點的顏色值!
如果[a,b]的子區間[c,d]沒被跟新,那麼tree[p]也是[c,d]的值!
否則,在更新[c,d]區間的時候,一定會經過 p 點!然後由上到下更新p<<1 和 p<<1|1 的值!
當找到[c,d]區間所對應的p『時,並更新p』的值!、
之前的剪枝是點返回, 後面的是線段返回,當然更快!
*/ #include
#include
#include
#include
#include
#define m 100005
using namespace std;
int tree[4*m];
int color[32];
int l, t, o;
void buildt(int ld, int rd, int p) }
void updatet(int ld, int rd, int a, int b, int p, int k)
if(tree[p]!=-1)
if(ldint mid = (ld+rd)/2;
if(midupdatet(mid+1, rd, a, b, p<<1|1, k);
else if(mid>=b)
updatet(ld, mid, a, b, p<<1, k);
else }
}void queryt(int ld, int rd, int a, int b, int p)
else }
}int main()
updatet(1, l, a, b, 1, c);
}
else
memset(color, 0, sizeof(color));
queryt(1, l, a, b, 1);
int cnt=0;
for(int i=1; i<=t; ++i)
if(color[i]) ++cnt;
printf("%d\n", cnt); }
} }
return 0; }
線段樹模板 poj2777
線段數塗色 include include using namespace std define maxn 100005 struct node tree maxn 4 bool visit 40 int sum void build int left,int right,int id tree i...
POJ2777 線段樹染色
初始顏色均為1,倆操作 修改 將 l,r 染為顏色z 查詢 l,r 的不同顏色數 1e5個點,1e5個操作,30種顏色 查詢 如果查詢維護區間顏色數,不滿足區間加法 顏色數較少,維護區間顏色狀態s val pushup 當前子樹s 左子樹s 右子樹s 修改 維護顏色替換標記lazy 注意pushdo...
POJ 2777 線段樹 位運算
poj 2777 有乙個長位l的區間,有t種顏色,進行o次操作,每次操作 1 n 100000,1 t 30 1 o 100000 每次操作有兩種形式 p a b c 將區間 a,b 染成顏色c q a b 詢問區間 a,b 有多少種不同的顏色 每個點的初始顏色都是1 注意 a可能大於b 線段樹的區...