/* 以前做过一个插队的题,这个类似从后往前操作 */ #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; }
时间: 2024-10-14 19:35:21