bzoj 4817 Sdoi2017 樹點塗色

2022-08-02 11:30:20 字數 2007 閱讀 7635

bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路

徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。bob可能會進行這幾種操作:

1 x:

把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。

2 x y:

求x到y的路徑的權值。

3 x y:

在以x為根的子樹中選擇乙個點,使得這個點到根節點的路徑權值最大,求最大權值。

bob一共會進行m次操作

第一行兩個數n,m。

接下來n-1行,每行兩個數a,b,表示a與b之間有一條邊。

接下來m行,表示操作,格式見題目描述

1<=n,m<=100000 

每當出現2,3操作,輸出一行。

如果是2操作,輸出乙個數表示路徑的權值

如果是3操作,輸出乙個數表示權值的最大值

5 61 2

2 33 4

3 52 4 5

3 31 4

2 4 5

1 52 4 534

22鳴謝infinityedge上傳

這個題真的是醉得不行。。。

考慮到第乙個操作很煩,但是我們可以用lct的access來解決這一操作。。。

我們把這個點access的時候,把當前點的原來的重兒子所在的子樹權值+1,把新接上來的重兒子的子樹的權值-1。。。

(這個直接用線段樹來實現。。。)

只有原來的重兒子的子樹的val值要改變(+1),其餘兒子的val值是不變(只是換了一種別的顏色而已,總數不變)。。。

而新接上的重兒子的子樹內因為少了當前點的顏色而需要-1(原來當前點和新重兒子是不同色的。。。)

注意這些修改都是找到深度最小的點的子樹來修改。。。

然後對於第二個操作的查詢,就是 查詢val[u]+val[v]-2*val[lca(u,v)]+1。。。(因為u,v的顏色不相同,分lca的顏色討論一下)

// made by qt666

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=300050;

int n,m;

struct tree

void dfs1(int x,int f)

}} void dfs2(int x,int ff)

ed[x]=tt;

} int lca(int x,int y)

void update(int x,int l,int r,int xl,int xr,int tag)

int mid=(l+r)>>1;

if(xr<=mid) update(ls[x],l,mid,xl,xr,tag);

else if(xl>mid) update(rs[x],mid+1,r,xl,xr,tag);

else update(ls[x],l,mid,xl,mid,tag),update(rs[x],mid+1,r,mid+1,xr,tag);

max[x]=max(max[ls[x]],max[rs[x]])+lazy[x];

} int query(int x,int l,int r,int xl,int xr,int la)

}seg;

struct link_cut_tree

void rotate(int x)

fa[x]=z;fa[y]=x;fa[c[x][r]]=y;

c[y][l]=c[x][r];c[x][r]=y;

} void splay(int x)

rotate(x);

}} void access(int x)

if(t)

c[x][1]=t;t=x;x=fa[x];

}}}lct;

int main(){

scanf("%d%d",&n,&m);

for(int i=1;i然後對於第三個操作就是查詢子樹最大值。。。

Bzoj4817 SDOI2017 樹點塗色

bzoj 做個轉化 最開始都是虛邊 操作1 1 就是lc t role presentation lct lct裡的 acce ssa cc es s操作 求的就是路徑上虛邊的個數 1 然後就好辦了 用樹鏈剖分 線段樹來維護每個點到根虛邊的個數的最大值 操作1 1 access role prese...

BZOJ4817 Sdoi2017 樹點塗色

time limit 10 sec memory limit 128 mb submit 515 solved 302 submit status discuss bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點...

bzoj4817 SDOI2017 樹點塗色

bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x y 求x到y的路徑的權值...