[CodeForces 490B]Queue[实现]

题目链接:[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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值