poj2777線段樹 lazy思想

2022-09-03 03:27:08 字數 1062 閱讀 6936

題意:有乙個長板子,多次操作,有兩種操作,第一種是給從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 線段樹的區...