BZOJ4817 Sdoi2017 樹點塗色

2022-05-05 01:21:09 字數 1748 閱讀 1358

time limit: 10 sec  memory limit: 128 mb

submit: 515  solved: 302

[submit][status][discuss]

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思路+1$。

線段樹大力搞一下就可以了。

}

#include#define ll long long

#define rg register

#define il inline

#define n 100010

using namespace std;

namespace tree

}void modify(int o,int l,int r,int l,int r,int num)

down(o);

if(mid=r)modify(ls,l,mid,l,r,num);

else modify(rs,mid+1,r,l,r,num),modify(ls,l,mid,l,r,num);

max[o]=max(max[rs],max[ls]);

}int query(int o,int l,int r,int l,int r)

}struct ede[n*2];

int f[19][n],head[n],tot,dfn[n],til[n],id,n,q,fa[n],ch[n][2],dep[n],st[n];

void link(int u,int v)

void dfs(int u,int faa)til[u]=id;

}int lca(int x,int y)return x;

}bool isroot(int x)

void rotate(int x)

void splay(int x)rotate(x);

}}int find(int x)

void access(int x)

if(ch[x][1])

ch[x][1]=t,t=x,x=fa[x];

}}int main()

dfs(1,1);int flag,x,y;fa[1]=0;

using namespace tree;

for(int i=1;i<=q;++i)

if(flag==3)printf("%d\n",query(1,1,n,dfn[x],til[x]));

}return 0;

}

Bzoj4817 SDOI2017 樹點塗色

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

bzoj4817 SDOI2017 樹點塗色

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

bzoj 4817 Sdoi2017 樹點塗色

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