poj2777線段樹,狀態壓縮

2021-07-08 18:10:48 字數 1036 閱讀 6334

題意:

就是一堆石頭,開始全是一種顏色;

之後叫你染色,顏色不超過30種;

染色的規則是一段一段染;

叫你求某一段區間的顏色種數;

理解:這題一看就是線段樹;

主要就是記錄顏色的問題;

開始我以為是線段樹區間合併的問題;

結果經過師兄師姐的薰陶;

發現果然是狀態壓縮;

就是用數字記錄顏色的種數;

因為不超過30種,所以用二進位制每一位去記錄顏色是一種很好的方法;

而且合併就是相或(|);

這樣就不是區間合併了;

**如下:

#include #include using namespace std;

#define ll long long

ll tree[500000];

int up[500000];

ll build(int l, int r, int rx)

void push_down(int l, int r, int rx)

up[rx] = 0;

}ll update(int l, int r, int l, int r, int rx, int t)

if (up[rx])

return tree[rx]

= update(l, r, l, (l + r) / 2, rx * 2, t)

| update(l, r, (l + r) / 2 + 1, r, rx * 2 + 1, t);

}ll query(int l, int r, int l, int r, int rx)

if (up[rx])

return query(l, r, l, (l + r) / 2, rx * 2)

| query(l, r, (l + r) / 2 + 1, r, rx * 2 + 1);

}int main()

else

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

return 0;

}

Poj2777(線段樹 標記 狀態壓縮)

題目鏈結 題目大意 給你乙個長為l的板,然後給上邊的每一段塗顏色,給出一系列操作對應更新區間或輸出該區間有多少中顏色,本題肯定能想到線段樹來解決,然後根據t 30想到用狀態 壓縮的方法,用位運算同時也要加上lazy標記,不然很容 易超時。注意異或 的用法 x 1 k 1 0 表示x的第k位 從 k ...

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