SDOI2011 染色 題解

2022-07-13 20:15:16 字數 1454 閱讀 2214

題目大意:

給定一棵有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個節點的樹,每個節點有顏色,支援兩種操作 樹上的鏈操作擺明了要用樹鏈剖分.用線段樹來維護資訊.線段樹的每個節點需要儲存,區間的顏色數量,以及區間左端點的顏色和右端點的顏色.以下是線段樹中特殊操作 先把左右兒子的顏色段數加起來.如果左兒子的右端點和右兒子的左端點是同一種顏色,那麼顏色...