題意:
兩種操作:
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 ...