poj 2777(線段樹的節點更新策略)

2021-09-20 15:06:40 字數 1207 閱讀 5063

/*

之前的思想是用回溯的方式進行顏色的更新的!如果用回溯的方法的話,就是將每乙個節點的顏色都要更新

通過子節點的顏色情況來判斷父節點的顏色情況 !這就是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 線段樹的區...