題意:有乙個長板子,多次操作,有兩種操作,第一種是給從a到b那段染一種顏色c,另一種是詢問a到b有多少種不同的顏色。
這題更加讓我理解線段樹的結構了,特別是lazy思想的運用。
事實上lazy思想就是個懶人的標記,若對於這個結點lazy標記為true,就代表不需要繼續查詢縮小的區間了。
主要是在更新結點的地方,若填充整個區間時,標記lazy,則在下次其他的更新操作時,若結點為ture,則在更新操作中。
為了控制標記,取消原來結點的標記false,表示此節點不可用,即該結點代表的線段中有不同的取值,然後在左右子樹中標記lazy,直到填充整個區間。
#include #include #include #include using namespace std;#define maxn 100004
struct node
tree[maxn * 3];
int n, t, o, ncount;
void buildtree(node *proot, int l, int r)
void paint(node *proot, int l, int r, int color)
if (proot->end) //lazy思想,當一次取整塊lr區間時,標記end,
int mid = (proot->l + proot->r) / 2;
if (r <= mid)
paint(proot->pleft, l, r, color);
else if(l > mid)
paint(proot->pright, l, r, color);
else
proot->color = proot->pleft->color | proot->pright->color; //位運算
}int query(node *proot, int l, int r)
int countbit(int a)
int main()
else
getchar();
}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 線段樹的區...