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

2021-07-22 21:17:16 字數 2211 閱讀 6857

題意:

兩種操作:

1.修改u到v路徑上的點的顏色為c

2.詢問u到v路徑上有多少段顏色

線段樹上用區間合併來維護答案

主要是在詢問時要考慮一下,維護上個段的最後節點顏色來維護顏色段數

#include 

#define sf scanf

#define pf printf

using namespace std;

const

int maxn = 100000 + 5;

int n,m;

//邊集

struct edgees[maxn * 2];

int head[maxn],tot_edge;

void init_edge()

void add_edge(int u,int v,int c)

//樹鏈剖分

int son[maxn],fa[maxn],dep[maxn],size[maxn];

int top[maxn],tid[maxn],rank[maxn],segsize;

int dfs(int rt)

}return size[rt];

}void split(int rt,int tp)

}}void treelinesplit()

//線段樹

#define lson rt << 1 , l , mid

#define rson rt << 1 | 1,mid + 1,r

int left[maxn << 2],right[maxn << 2],cnt[maxn << 2],num[maxn];

int cover[maxn << 2];

void pushup(int rt)

void pushdown(int rt)

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

int mid = l + r >> 1;

segtreebuild(lson);segtreebuild(rson);

pushup(rt);

}int left_color,right_color;

int query(int rt,int l,int r,int l,int r)

pushdown(rt);

int mid = l + r >> 1,ret = 0,f = 0;

if(l <= mid) ret += query(lson,l,r),f++;

if(r > mid) ret += query(rson,l,r),f++;

if(f == 2 && right[rt << 1] == left[rt << 1 | 1]) ret--;

pushup(rt);

return ret;

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

pushdown(rt);

int mid = l + r >> 1;

if(l <= mid) update(lson,l,r,c);

if(r > mid) update(rson,l,r,c);

pushup(rt);

}int init_color[maxn];

void getnumar()

}//題目操作

int ans_query(int u,int v)

preu = left_color;

u = fa[top[u]];

}else

prev = left_color;

v = fa[top[v]];}}

left_color = -1;

if(dep[u] < dep[v])

else

return ret;

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

if(dep[v] < dep[u]) swap(u,v);

update(1,1,n,tid[u],tid[v],c);

}char op[10];

int main()

treelinesplit();

getnumar();

segtreebuild(1,1,n);

left_color = -1;

while(m--)

else}}

}

HYSBZ 2243 染色 樹鏈剖分

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

HYSBZ 2243 染色 (樹鏈剖分)

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

bzoj 2243 染色 樹鏈剖分

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