可愛的樹鏈剖分(染色)

2021-09-29 03:02:36 字數 1506 閱讀 8876

這道題 就是 一道 普通的! 樹鏈剖分+線段樹覆蓋

注意一下兩個線段樹合併的時候 如果 lva

l(no

de

<

<1∣

1)==

rval

(nod

e<

<1)

lval(node<<1|1)==rval(node<<1)

lval(n

ode<

<1∣

1)==

rval

(nod

e<

<1)

相當於這兩個線段樹的相鄰的數字數相同的 那麼合併時的tot

tottotsu

msum

sum 應該 –

所以說這道題有什麼細節嗎 我感覺是沒有的 然而我調了一下午+晚上兩個小時 (再次感謝人帥心善的kma小哥哥) (話說為什麼他有這麼多女朋友,而我還是單身呢) 不 我有萌德

#include #include #include #include #define int long long

using namespace std;

const int maxn=1e6+10;

int read()

while(ch>='0' && ch<='9');

return x*f;

}int n,m,color[maxn],fir[maxn<<1],nxt[maxn<<1],to[maxn<<1],tot,top[maxn];

int size[maxn],son[maxn],fa[maxn],rk[maxn],id[maxn],dep[maxn],times;

char op[3];

struct nodeetree[maxn<<4];

void add(int x,int y)

void dfs1(int x)

void push_down(int node)

}void modify(int node,int ql,int qr,int z)

push_down(node);

int mid=l(node)+r(node)>>1;

if(ql<=mid) modify(node<<1,ql,qr,z);

if(mid>1;

if(ql>mid) ans+=query(node<<1|1,ql,qr);

else if (qr <= mid) ans += query(node<<1,ql,qr);

else

return ans;

}int chain_query(int x,int y){

last1 = 0, last2 = 0, lval = 0, rval = 0;

int tx=top[x],ty=top[y];

int ans=0;

while(tx!=ty){

if(dep[tx]但是注意一下 在chain_query 和 chain_modify 的時候 最後的判斷語句一定不能改方向(為什麼呢我不知道) 我好難受啊

染色 樹鏈剖分

先樹剖,然後再線段樹維護 考慮對每個節點維護 n um numnu m值 表示當前區間顏色段數量 l clc lc值 表示當前區間最左端的顏色 r crc rc值 表示當前區間最右端的顏色 合併時,如果左兒子的rc rc rc 右兒子的lclc lc,那麼合併後父節點的num numnu m值還要減...

bzoj 2243 染色 樹鏈剖分

首先這是個挺裸的題,由於太久沒寫剖分導致調了好久,前天調了一下午,一直查不到錯 昨晚在看春晚的時候突然靈機一動,發現合併的時候出了問題,開電腦把它a掉了 感覺自己也蠻拼的給定 一棵有n 個節點的 無根樹和 m個操作 操作有 2類 1 將節點a 到節點b 路徑上所 有點都染 成顏色c 2 詢問節點a ...

HYSBZ 2243 染色 樹鏈剖分

思路 單點的樹鏈剖分題目.大致的思路與邊問題的樹鏈剖分大同小異.只是在處理相鄰的顏色的計算的時候需要仔細.wa了幾發.這邊就寫一下我處理的思路以及記得起來的wa點.理解樹鏈剖分之後,你會明白,樹鏈剖分是按照路徑兩邊往中間縮.所以我用cu,cv標記兩端的顏色.當需要從u開始搜的時候,我就比對一下該端的...