★☆ 输入文件:heoi2016_tree.in
输出文件:heoi2016_tree.out
简单对比
时间限制:1 s 内存限制:128 MB
这道题数据弱到炸了 。
第一次做用树刨在链上找 A了。
第二次边都没连,直接赋值找爸爸 A了。。
#include <ctype.h> #include <cstdio> #define M 100005 void read(int &x) { x=0; bool f=0; char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) f=1;ch=getchar();} while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} x=f?(~x)+1:x; } struct Edge { int next,to; Edge (int next=0,int to=0) :next(next),to(to){} }edge[M<<1]; int tim,cnt,fa[M],top[M],dep[M],belong[M],size[M],sign[M],N,Q,head[M]; void add(int u,int v) { edge[++cnt]=Edge(head[u],v); head[u]=cnt; } void dfs1(int x) { size[x]=1; dep[x]=dep[fa[x]]+1; for(int i=head[x];i;i=edge[i].next) { int v=edge[i].to; if(fa[x]!=v) { fa[v]=x; dfs1(v); size[x]+=size[v]; } } } void dfs2(int x) { belong[x]=++tim; int t=0; if(!top[x]) top[x]=x; for(int i=head[x];i;i=edge[i].next) { int v=edge[i].to; if(fa[x]!=v&&size[t]<size[v]) v=t; } if(t) top[t]=top[x],dfs2(t); for(int i=head[x];i;i=edge[i].next) { int v=edge[i].to; if(fa[x]!=v&&v!=t) dfs2(v); } } int Chain_query(int x) { for(;x;x=fa[x]) if(sign[x]) return x; } int main() { freopen("heoi2016_tree.in","r",stdin); freopen("heoi2016_tree.out","w",stdout); read(N); read(Q); sign[1]=1; for(int x,y,i=1;i<N;i++) { read(x); read(y); fa[y]=x; } // dfs1(1); // dfs2(1); char str[5]; for(int x;Q--;) { scanf("%s",str+1); read(x); if(str[1]==‘C‘) sign[x]=1; else { if(sign[x]) printf("%d\n",x); else printf("%d\n",Chain_query(x)); } } return 0; }
原文:http://www.cnblogs.com/ruojisun/p/7197479.html