初始顏色均為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 線段樹的區...