zoukankan      html  css  js  c++  java
  • COGS 2274. [HEOI 2016] tree

    ★☆   输入文件: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
    ",x);
                else printf("%d
    ",Chain_query(x));
            }
        }
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    [Noip2017]逛公园
    [NOI2005]瑰丽华尔兹
    codeforces 558E A Simple Task
    bzoj1812 riv(树形背包)
    bzoj 1009 GT考试
    bzoj1030 文本生成器 Trie图+dp
    bzoj1500 维修数列(splay)
    [NOI2008]假面舞会
    测试用例的基本知识
    使用Xmind编写测试用例
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7197479.html
Copyright © 2011-2022 走看看