HYSBZ 2243 染色 樹鏈剖分

2021-06-29 12:57:42 字數 2230 閱讀 4766

思路:單點的樹鏈剖分題目.大致的思路與邊問題的樹鏈剖分大同小異.

只是在處理相鄰的顏色的計算的時候需要仔細.wa了幾發.

這邊就寫一下我處理的思路以及記得起來的wa點.

理解樹鏈剖分之後,你會明白,樹鏈剖分是按照路徑兩邊往中間縮.

所以我用cu,cv標記兩端的顏色.

當需要從u開始搜的時候,我就比對一下該端的上乙個邊緣顏色是否相同.假如相同的話必然減一.

好了,這個可以解決大部分問題.

剩下的還有乙個問題.

就是當其中乙個端點已經縮到根上的時候.並且也就是挑出迴圈之後我們所要做的處理.

這時候我們做的還是一樣,這個時候因為只剩這麼乙個區間了(這個區間可能是1個點也可能是多個點)

所以我們要做的就是將這個區間的兩端的邊緣顏色與cu,cv對應比較,假如相同,則答案要減一.

其實上面的處理也是要與兩端對應比較,但應該這個時候另外一端還沒有縮過來,對應顏色為-1,肯定不同,所以就不用比了.

現在是我的wa點.我wa的資料為:

6 100

2 2 1 2 1 1

1 21 3

2 42 5

2 6c 4 3 1

c 2 2 2

q 4 1 

#define _crt_secure_no_warnings

#include#include#include#includeusing namespace std;

#define max 100010

#define ls rt<<1

#define rs ls|1

#define m (l+r)>>1

int sum[max << 2], lb[max << 2], rb[max << 2], col[max << 2];

int son[max], size[max], pre[max], top[max], deep[max];

int cnt, pos;

int head[max], posx[max],posx2[max],co[max], e[max][2];

struct edgeedg[max << 1];

void addedge(int u, int v)

void dfs(int u, int p, int d) }}

void getpos(int u, int p)

}//線段樹

void uprt(int rt)

void ups(int rt)

}void build(int l, int r, int rt)

int mid = m;

build(l, mid, ls);

build(mid + 1, r, rs);

uprt(rt);

}void updata(int l, int r, int c, int l, int r, int rt)

ups(rt);

int mid = m;

if (l <= mid)

updata(l, r, c, l, mid, ls);

if (middeep[v])

if (cu == getco(posx[u], 1, pos - 1, 1))

ans--;

cu = getco(posx[v], 1, pos - 1, 1);

ans += query(posx[u], posx[v], 1, pos - 1, 1);

if (cu == cv)

ans--;

return ans;

}void solve(int u, int v, int c)

updata(posx[fu], posx[u], c, 1, pos - 1, 1);

u = pre[fu];

fu = top[u];

} if (u == v)

if (deep[u]>deep[v])swap(u, v);

updata(posx[u], posx[v], c, 1, pos - 1, 1);

}void init()

int main()

dfs(1, 1, 0);

getpos(1, 1);

build(1, pos - 1, 1);

char str[10];

int a, b, c;

for (int i = 0; i < k; i++)

else

}}}

HYSBZ 2243 染色 (樹鏈剖分)

1a!哈哈哈哈哈沒看題解 沒套模板哈哈哈哈 太感動了!如果只是線段樹的話這道題倒是不難,只要記錄左右邊界就好了,類似很久以前做的hotel的題 但是樹上相鄰的段會有連續的 樹上top x 和fa top x 是連續的,但是線段樹上是算不到的,所以要判斷下 線段樹記錄的是區間的數量,但是求單點的時候求...

HYSBZ 2243 染色 樹鏈剖分 點上剖分

題意 兩種操作 1.修改u到v路徑上的點的顏色為c 2.詢問u到v路徑上有多少段顏色 線段樹上用區間合併來維護答案 主要是在詢問時要考慮一下,維護上個段的最後節點顏色來維護顏色段數 include define sf scanf define pf printf using namespace st...

bzoj 2243 染色 樹鏈剖分

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