POJ2777 線段樹染色

2021-08-15 19:10:52 字數 1290 閱讀 2726

初始顏色均為1,倆操作

修改:將【l,r】染為顏色z

查詢:【l,r】的不同顏色數

1e5個點,1e5個操作,30種顏色

查詢:如果查詢維護區間顏色數,不滿足區間加法

顏色數較少,維護區間顏色狀態s (val)

pushup:當前子樹s=左子樹s |  右子樹s

修改:維護顏色替換標記lazy

注意pushdown跟update中的對lazy跟val的寫法

391ms

#include#include#includeusing namespace std;

const int inf=0x3f3f3f;

struct stree

sts[4*100005]; //開4倍

int pushup(int root)

int pushdown(int root)

}void build(int l,int r,int root)//根節點從1開始吧

else }

int query(int nowl,int nowr,int ql,int qr,int root)

pushdown(root);

int mid=(nowl+nowr)>>1;

int ans=0;

if(ql<=mid)ans|=query(nowl,mid,ql,qr,root<<1);

if(qr>mid)ans|=query(mid+1,nowr,ql,qr,root<<1|1);

return ans;

}void update(int nowl,int nowr,int ul,int ur,int root,int addval)//nowl,nowr 當前區間 ul,ur 需修改的區間

int mid=(nowl+nowr)>>1;

pushdown(root);

if(ul<=mid) update(nowl,mid,ul,ur,root<<1,addval);//左子樹與修改區間有交集

if(ur>mid) update(mid+1,nowr,ul,ur,root<<1|1,addval);

pushup(root);

}void op(int n);

int main()

else

state=(state>>1);

}printf("%d\n",ans);

}getchar();

} }}void op(int n)

printf("///\n");

}

線段樹染色問題(例題為poj2777)

假設某大學有一面文化牆,各個學院都可以在上面塗色,要求塗色區域高必須和牆一樣,寬度任意但必須是整數 以公尺為單位 塗色可以覆蓋其他學院的塗色。現在若干個學院塗色之後最終這面牆上能看見多少種顏色。這就是簡單的染色問題了。當然有很多種不同的說法,但整體上離不開這兩個問題 1.區域覆蓋。2.多種染色方式。...

線段樹模板 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...

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 線段樹的區...