1. 程式人生 > >COGS 2274. [HEOI 2016] tree

COGS 2274. [HEOI 2016] tree

getchar() label size freopen can urn har printf read

★☆ 輸入文件: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; }

COGS 2274. [HEOI 2016] tree