HYSBZ 2243 染色 (樹鏈剖分)

2022-01-15 04:23:27 字數 1991 閱讀 2713

1a!!! 哈哈哈哈哈沒看題解 沒套模板哈哈哈哈 太感動了!!

如果只是線段樹的話這道題倒是不難,只要記錄左右邊界就好了,類似很久以前做的hotel的題

但是樹上相鄰的段會有連續的

樹上top[x]和fa[top[x]]是連續的,但是線段樹上是算不到的,所以要判斷下

線段樹記錄的是區間的數量,但是求單點的時候求得是顏色,需要注意下

#include #include 

#include

using

namespace

std;

const

int n = 100005

;int

a[n];

struct

edge edge[n*2

];int

head[n], cnte;

void addedge(int u, int

v) int

dep[n], fa[n], sz[n], son[n];

void dfs1(int u, int pre, int

d) }

}int

top[n], dfn[n], rk[n], idx;

void dfs2(int u, int

tp)

}}int tr[n<<2], ltr[n<<2], rtr[n<<2]; //

tr[i] means the number of color segment

int fg[n<<2

];#define lson o<<1

#define rson o<<1|1

void pushup(int

o) void pushdown(int

o) }

void build(int o, int l, int

r)

int mid = (l+r) >> 1

; build(lson, l, mid);

build(rson, mid+1

, r);

pushup(o);

}void change(int o, int l, int r, int l, int r, int

v) pushdown(o);

int mid = (l+r) >> 1

;

if (mid >=l) change(lson, l, mid, l, r, v);

if (mid < r) change(rson, mid+1

, r, l, r, v);

pushup(o);

}void change(int x, int y, int n, int

c)

if (dep[x] >dep[y]) swap(x, y);

change(

1, 1

, n, dfn[x], dfn[y], c);

}int query(int o, int l, int r, int l, int

r)

else

if (mid >=r)

else

}int qq(int o, int l, int r, int

p) int query(int x, int y, int

n)

if (dep[x] >dep[y]) swap(x, y);

ans += query(1, 1

, n, dfn[x], dfn[y]);

return

ans;

}void

init()

intmain()

dfs1(

1, 0, 0); dfs2(1, 1); build(1, 1

, n);

char op[10

];

while (m--)

else}}

return0;

}

HYSBZ 2243 染色 樹鏈剖分

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

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 ...