题目链接:[CodeForces 490B]Queue[实现]
题意分析:
给出队伍中各个同学的前面和后面是谁,输出整个队伍。
解题思路:
因为记录的是前面和后面的同学,所以奇数号同学记录的是偶数号同学的位置,同理,偶数号同学记录的也是如此。
可以发现,2号同学是被1号同学记录,1号同学的前驱同学为0,也就是不存在,所以给出一系列信息,我们总能依据0号(那个不存在的同学)把所有偶数号同学的位置确定下来。
剩下的就是奇数号同学怎么确定下来了。
由于整个奇数号同学构成一条链,我们只需要找到其中一个奇数号同学,顺着往前遍历,就能好到这个奇数链的第一号了。接着就和偶数一样的做法了。
个人感受:
被一道B题卡,唉呀呀。。。。。
具体代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1e6 + 111;
int nx[MAXN], ans[MAXN], pr[MAXN]; //nx:节点的后一个节点 pr:节点的前一个节点
bool vis[MAXN];
int main()
{
int n, a, b;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
scanf("%d%d", &a, &b);
nx[a] = b;
pr[b] = a;
vis[a] = vis[b] = 1; //记录都有什么编号出现过,用于查找位置为奇数同学
}
int pos = 2;
for (int i = nx[0]; i; i = nx[i], pos += 2) //偶数位置的同学
{
ans[pos] = i;
vis[i] = 0;
}
for (pos = 1; ; ++pos) //查找任意一个奇数位置的同学
{
if (vis[pos]) break;
}
while (pr[pos]) //往前遍历
{
pos = pr[pos];
}
int start = pos;
pos = 1;
for (int i = start; i; i = nx[i], pos += 2) //记录答案
{
ans[pos] = i;
}
printf("%d", ans[1]);
for (int i = 2; i <= n; ++i)
printf(" %d", ans[i]);
printf("\n");
return 0;
}