哈尔滨理工大学第六届程序设计团队 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\n",w.size());
        for(int i=0;i<w.size();i++)
            printf("%d ",w[i]);
        printf("\n");
    }
    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\n",w.size());
        for(int i=0;i<w.size();i++)
            printf("%d ",w[i]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2016-12-10 21:32  勿忘初心0924  阅读(254)  评论(0编辑  收藏  举报