zoukankan      html  css  js  c++  java
  • 哈尔滨理工大学第六届程序设计团队 I-Team

    /*
    以前做过一个插队的题,这个类似从后往前操作
    */
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #define N 600000
    using namespace std;
    struct node
    {
        int x,y,z;
        //每一个操作,z表示这个操作是不是有效的
        node(){}
        node(int a,int b,int c)
        {
            x=a;
            y=b;
            z=c;
        }
    };
    vector<node>v;
    vector<int>w;
    int t,n,m;
    int x,y,z;
    int done[N];//表示当前数字操作过没有
    int a[N];//表示那些人被添加进来了
    void init()
    {
        memset(a,0,sizeof a);
        v.clear();
        v.push_back(node(0,0,0));
        w.clear();
        memset(done,0,sizeof done);
    }
    int main()
    {
        //freopen("C:\Users\acer\Desktop\in.txt","r",stdin);
        scanf("%d",&t);
        //cout<<t<<endl;
        while(t--)
        {
            init();
            scanf("%d%d",&n,&m);
            //cout<<n<<" "<<m<<endl;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&x,&y);
                v.push_back(node(x,y,1));
            }
            for(int i=v.size()-1;i>=0;i--)
            {
                if(v[i].z)//这个操作可以做
                {
                    if(v[i].x==3)
                        v[v[i].y].z=0;
                    else if(v[i].x==1)
                    {
                        if(done[v[i].y]==0)
                        {
                            a[v[i].y]=1;
                            done[v[i].y]=1;
                        }
    
                    }
                    else if(v[i].x==2)
                    {
                        if(done[v[i].y]==0)
                        {
                            a[v[i].y]=0;
                            done[v[i].y]=1;
                        }
                    }
                }
            }
            for(int i=1;i<=n;i++)
            {
                //cout<<a[i]<<" ";
                if(a[i]==1)
                {
                    w.push_back(i);
                    //cout<<i<<" ";
                }
            }
            //cout<<endl;
            printf("%d
    ",w.size());
            for(int i=0;i<w.size();i++)
                printf("%d ",w[i]);
            printf("
    ");
        }
        return 0;
    }
    /*
    急需一个能写模拟的队友,在线等挺急的
    
    莫名地RE了,所有能考虑的地方都考虑了
    */
    /*
    先不要进行操作,先将所有的操作跑一边看看哪些1,2操作是有效的,哪些是无效的
    */
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #define N 600000
    using namespace std;
    struct node
    {
        int x,y,z;
        //每一个操作,z表示这个操作是不是有效的
        node(){}
        node(int a,int b,int c)
        {
            x=a;
            y=b;
            z=c;
        }
    };
    vector<node>v;
    vector<int>w;
    int t,n,m;
    int x,y,z;
    int a[N];//表示那些人被添加进来了
    void recall(int x)//x就是要撤销的x号操作
    {
        if(x<1||x>v.size())
            return;
        //cout<<x<<endl;
        if(v[x].x!=3)//如果要撤销的是1,2号操作的话
        {
            v[x].z^=1;//将这个操作撤销
            //如果已经被撤销了的话就不用管了
            return ;
        }
        else
        {
            v[x].z^=1;//将这个操作撤销
            recall(v[x].y);//继续递归下去撤销下一个操作
            //如果已经被撤销了的话就不用管了
        }
    }
    void init()
    {
        memset(a,0,sizeof a);
        v.clear();
        v.push_back(node(0,0,0));
        w.clear();
    }
    int main()
    {
        //freopen("C:\Users\acer\Desktop\in.txt","r",stdin);
        scanf("%d",&t);
        //cout<<t<<endl;
        while(t--)
        {
            init();
            scanf("%d%d",&n,&m);
            //cout<<n<<" "<<m<<endl;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&x,&y);
                //cout<<x<<" "<<y<<endl;
                if(x==1)
                {
                    v.push_back(node(x,y,1));
                }
                else if(x==2)
                {
                    v.push_back(node(x,y,1));
                }
                else if(x==3)
                {
                    v.push_back(node(x,y,1));
                    //cout<<"**********"<<endl;
                    recall(y);
                   // cout<<"**********"<<endl;
                }
            }
            for(int i=0;i<v.size();i++)
            {
                if(v[i].x!=3)//只有1,2号操作可以
                {
                    if(v[i].z)//这个操作有效的
                    {
                        //cout<<v[i].x<<" "<<v[i].y<<endl;
                        if(v[i].x==1)
                        {
                            a[v[i].y]=1;
                        }
                        else if(v[i].x==2)
                        {
                            a[v[i].y]=0;
                        }
                    }
                }
            }
            for(int i=1;i<=n;i++)
            {
                //cout<<a[i]<<" ";
                if(a[i]==1)
                {
                    w.push_back(i);
                    //cout<<i<<" ";
                }
            }
            //cout<<endl;
            printf("%d
    ",w.size());
            for(int i=0;i<w.size();i++)
                printf("%d ",w[i]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    1104--DNA排序
    poj1050-To the Max
    编译:一个 C 程序的艺术之旅(转载)
    大话同步/异步、阻塞/非阻塞(转载)
    Windows 在 git bash下使用 conda 命令
    Python Multiprocessing 多进程,使用多核CPU计算 并使用tqdm显示进度条
    Python 写入训练日志文件并控制台输出
    nn.Conv2d 参数及输入输出详解
    Python中 list, numpy.array, torch.Tensor 格式相互转化
    Linux 上传代码到github
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6158344.html
Copyright © 2011-2022 走看看