Description
![](https://i-blog.csdnimg.cn/blog_migrate/4f0b298a9999b55e4f3416337af8b938.jpeg)
Input
![](https://i-blog.csdnimg.cn/blog_migrate/0cd82bca1bb9b7a4e3370f275d401164.jpeg)
Output
![](https://i-blog.csdnimg.cn/blog_migrate/64d9180fbd6fc6ff8eeea033de82e689.jpeg)
Sample Input
5 4
1 2
1 3
3 4
3 5
1 4
2 4
1 2
2 5
Sample Output
3
1
1
2
Data Constraint
![](https://i-blog.csdnimg.cn/blog_migrate/8ca4b948cfc0979eacab47750c61328f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c0b571eaddd331b915622c3c2de7c1f1.jpeg)
Hint
![](https://i-blog.csdnimg.cn/blog_migrate/7f2ed2cd70f5d155dd51d362ad931353.jpeg)
分析
先不考虑操作2,只考虑操作1
较为显然的是操作1遵从的顺序是后序遍历
而么操作2其实相当于删去这个点所在的有颜色的链的最顶端,那么会改变染色的顺序
查找链顶,我们可以用倍增,而染色的顺序如何维护?小根堆即可
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int N=1e5+10; struct Graph { int u,v,nx; friend bool operator < (Graph a,Graph b) { return a.v>b.v; } }g[2*N]; int cnt,list[N]; int s[4*N],lz[4*N],rt; int n,t,x,f[N][20],id[N],dep[N],rev[N]; bool col[N]; priority_queue<int,vector<int>,greater<int> > q; void DFS(int u,int fa) { f[u][0]=fa;dep[u]=dep[fa]+1; for (int i=list[u];i;i=g[i].nx) if (g[i].v!=fa) DFS(g[i].v,u); id[++cnt]=u;rev[u]=cnt; } int Query(int x,int l,int r,int k) { if (l==r) return l; int mid=l+r>>1; if (s[x<<1]>=k) return Query(x<<1,l,mid,k); return Query((x<<1)+1,mid+1,r,k-s[x<<1]); } int main() { scanf("%d%d",&n,&t); for (int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),g[++cnt]=(Graph){u,v,0},g[++cnt]=(Graph){v,u,0}; sort(g+1,g+cnt+1); cnt=0; for (int i=1;i<=2*n-2;i++) g[++cnt]=(Graph){g[i].u,g[i].v,list[g[i].u]},list[g[i].u]=cnt; cnt=0;DFS(1,0); for (int i=1;i<19;i++) for (int j=1;j<=n;j++) f[j][i]=f[f[j][i-1]][i-1]; for (int i=1;i<=n;i++) q.push(i); for (int i=1;i<=t;i++) { int op; scanf("%d%d",&op,&x); if (op==1) { int r; while (x--) col[r=id[q.top()]]=1,q.pop(); printf("%d\n",r); } else { int a=x; for (int i=18;i>=0;i--) if (col[f[a][i]]) a=f[a][i]; col[a]=0;q.push(rev[a]); printf("%d\n",dep[x]-dep[a]); } } }