題意:
就是一堆石頭,開始全是一種顏色;
之後叫你染色,顏色不超過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...