Codeforces Round #279 (Div. 2) B - Queue (简单链表)

来源:互联网 发布:五子棋定式软件 编辑:程序博客网 时间:2024/06/05 15:29

这个题不错。 是一个简单的思路题。 不过自己好长时间才反应过来是个什么事。


对于一个队列。 给你每个人的前面的人的编号 和后面的人的编号。 给出原队列。


本以为这个题很简单的。 只要找到头尾 直接输出中间就可以了。。 不过WA了之后 发现了 原来是有序的。。。 (反应太慢了)


自己写一个样例 自己 先 写出 一个队列。 比如 6 5 8 7 4   那么  给定的输入 是 0 5       6 8       5 7        8  4       7 0


我们会发现 6 8 4 是一组   5 7 是一组。 那么其实问题就是这样的。 是两串数字。 每次先输出第一条链 在输出第二条链 这样循环输出就好了。


那么问题就是怎么找出头部。 其实 头部在数字中一定只出现了 一次 并且 左边没有数字,  第二个链的头部  在输入的时候 一定会是  0 X。


知道之后就做出来了。。


#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <cmath>#include <cstdlib>#include <string>#include <map>#include <vector>#include <set>#include <queue>#include <stack>#include <cctype>using namespace std;typedef long long LL;typedef unsigned long long ULL;#define MAXN 1000000+10#define INF (1<<30)#define mod 123456789int vis[MAXN][2] = {0};int l[MAXN];int main (){    int n;    scanf("%d",&n);    int a,b;    int two1 = 0,two2 = 0;    for(int i = 0; i < n; i++){        scanf("%d %d",&a,&b);        if(!a){            two1 = b;            vis[b][1] = 1; //1 前        }        else if(!b){            vis[a][0] = 1;        }        else{            l[a] = b;            vis[b][1] = 1; //1 前   b 的 前面有人            vis[a][0] = 1;          a 的 后面有人        }    }    int fro = 0, en = 0;    for(int i = 0; i <= MAXN-10; i++){        if(vis[i][0] && !vis[i][1])            fro = i;    }    printf("%d",fro);    printf(" %d",two1);    for(int i = 1; i < n/2; i++){        printf(" %d",l[fro]);        printf(" %d",l[two1]);        fro = l[fro];        two1 = l[two1];    }    if(n %2 == 1)        printf(" %d",l[fro]);    printf("\n");    return 0;}

 

0 0
原创粉丝点击