题意:https://ac.nowcoder.com/acm/contest/1099/K
分析:要求不断地让一个列表追加到另一个列表中,并反转。但是不停反转是很耗性能的,不停地反转将会导致超时。为了解决这个反转超时问题,我们开两个表,一个正向表,一个反向表。把正向表与反向表的元素对调一下,就相当于反转了。这样就不会超时了。用c++list(双向链表)模拟很方便。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6+5;
int n,m,a,b;
list<int> Z[N],D[N];
int main(){
while(~scanf("%d%d",&n,&m)) {
for(int i=1;i<=n;i++) {
Z[i].clear(),Z[i].push_back(i);
D[i].clear(),D[i].push_back(i);
}
while(m--) {
scanf("%d%d",&a,&b);
Z[a].splice(Z[a].end(),Z[b]);
D[b].splice(D[b].end(),D[a]);
swap(Z[a],D[b]);
swap(D[a],D[b]);
Z[b].clear();
D[b].clear();
}
printf("%d",Z[1].size());
for(auto it:Z[1])
printf(" %d",it);
printf("\n");
}
return 0;
}