題目大意:
給定一棵有n個節點的無根樹和m個操作,操作有2類:
1、將節點a到節點b路徑上所有點都染成顏色c;
2、詢問節點a到節點b路徑上的顏色段數量(連續相同顏色被認為是同一段)
思路:
樹剖之後,維護其兩端的顏色、答案和標記即可。
**:
#include#include#define n 100001
using
namespace
std;
int n,m,cnt,dfn,vis[n],head[n],to[n<<1],next[n<<1],deep[n],size[n],top[n],id[n],v[n],pa[n],lazy[n<<2],lc[n<<2],rc[n<<2],sum[n<<2
];void ins(int x,int
y)void dfs1(intx)}
void dfs2(int x,int
chain)
void build(int l,int r,int
cur)
void update(int
k)void pushdown(int l,int r,int
k)void change(int l,int r,int l,int r,int cur,int
val)
int mid=l+r>>1
; pushdown(l,r,cur);
if (r<=mid) change(l,mid,l,r,cur<<1
,val);
else
if (l>mid) change(mid+1,r,l,r,cur<<1|1
,val);
else change(l,mid,l,mid,cur<<1,val),change(mid+1,r,mid+1,r,cur<<1|1
,val);
update(cur);
}int ask(int l,int r,int l,int r,int
cur)
}int getc(int l,int r,int cur,int
x)int solvesum(int x,int
y)
if (deep[x]>deep[y]) swap(x,y);
return sum+=ask(1,n,id[x],id[y],1);}
void solvechange(int x,int y,int
val)
if (deep[x]>deep[y]) swap(x,y);
change(
1,n,id[x],id[y],1
,val);
}int
main()
else
}return0;
}
SDOI2011 飛彈攔截 題解
論printf lf 0.0 的重要性 給你nn 個三維的點 x,y,z x,y z 求出最長的三維不下降序列,並輸出每乙個點在最長的序列上的概率。這個肯定和普通的飛彈攔截不同了,普通的是沒有速度的,也就是二維的,且時間一維已經有序,那麼對高度求乙個lis lis 最長不下降序列 就好了。但是現在還...
SDOI 2011 染色 樹鏈剖分
題意 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點n路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 n,m 100000 思路 樹的形態沒有改變,用樹鏈剖分維護即可。pre1,...
SDOI2011 染色 樹鏈剖分
題目鏈結 有一棵n個節點的樹,每個節點有顏色,支援兩種操作 樹上的鏈操作擺明了要用樹鏈剖分.用線段樹來維護資訊.線段樹的每個節點需要儲存,區間的顏色數量,以及區間左端點的顏色和右端點的顏色.以下是線段樹中特殊操作 先把左右兒子的顏色段數加起來.如果左兒子的右端點和右兒子的左端點是同一種顏色,那麼顏色...