• 【noip模拟赛9】123法典


    描述

     

    很久很久以前,有个叫123的国家,这个国家的国王很喜欢颁布各种法令,并把这些法令记录在一部《123法典》中。最近这部法典终于被发掘了出来,专家们经过研究发现法典中的法令是按颁布的时间顺序记载的只有两种格式:

    QQ截图20190301022225.png

    同时,如果一条法令没有被其他有效的法令宣布无效,那么它就是有效的。现在他们想知道那些法令是有效的,你能帮助他们吗?

    输入

     

    第一行一个数N,表示法典中法令的数目。

    接下来N行每行一个字符串,表示一条法令,第i行的法令编号为i。法令按颁布时间顺序给出。

    输出

     

    第一行一个数K表示有效法令的数目。

    第二行K个数表示有效法令的编号,两个数中间用一个空格隔开。

    输入样例 1 

    5
    declare
    cancel 1
    declare
    cancel 2
    cancel 3

    输出样例 1

    3
    1 4 5

    输入样例 2 

    3
    declare
    declare
    declare

    输出样例 2

    3
    1 2 3

    提示

    【数据规模】

    对于全部的数据,N <= 100000

    WA一半 始终没找到为什么错

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define pb push_back
    #define fi first
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    ///////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 1000000+50
    
    int in[N];
    int vis[N];
    vector<int>edge[N];
    vector<int>ans;
    
    int main()
    {
        int n;
        RI(n);
        string str;
        rep(i,1,n)
        {
    
            cin>>str;
            if(str=="cancel")
            {
                int x;
                RI(x);
                in[x]+=1;
                edge[i].pb(x);
            }
        }
        queue<int>q;
    
        rep(i,1,n)
        if(in[i]==0)
            q.push(i);
    
        ans.clear();
        while(!q.empty())
        {
            int u=q.front();q.pop();
            if(!vis[u])
            ans.pb(u);
            if(edge[u].size())
            {
                int x=edge[u][0];
                vis[x]=1;
    
                if(edge[x].size() )
                {
                    int t=edge[x][0];
                    in[t]--;
                    if(in[t]==0&&!vis[t])
                        q.push(t);
                }
            }
        }
        if(ans.size())
        sort(ans.begin(),ans.end());
    
        printf("%d
    ",ans.size());
        if(ans.size())
        rep(i,0,ans.size()-1)
        {
            if(i!=0)printf(" ");
            printf("%d",ans[i]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    php navigat备份
    IBM技术俱乐部主席竞选
    IBM技术俱乐部主席竞选
    IBM技术俱乐部主席竞选
    IBM技术俱乐部主席竞选
    分治策略实验报告补充示例 汉诺塔实现
    分治策略实验报告补充示例 汉诺塔实现
    分治策略实验报告补充示例 汉诺塔实现
    分治策略实验报告补充示例 汉诺塔实现
    数字三角形问题 NOJ 1226
  • 原文地址:https://www.cnblogs.com/bxd123/p/10604851.html
Copyright © 2020-2023  润新知