队列安排

题目描述
一个学校里老师要将班上N个同学排成一列,同学被编号为1~N,他采取如下的方法:
1.先将1号同学安排进队列,这时队列中只有他一个人;
2.2~N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1~i -1中某位同学(即之前已经入列的同学)的左边或右边;
3.从队列中去掉M(M

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node {
    int left;
    int right;
} que[100001];
int head = 1;
int main() {
    int n;
    scanf("%d",&n);
    for(int i = 2; i<=n; i++) {
        int t1,t2;
        scanf("%d%d",&t1,&t2);
        if(t2) {
            que[i].right = que[t1].right;
            que[t1].right = i;
            que[i].left = t1;
            que[que[i].right].left = i;
        } else {
            que[i].left = que[t1].left;
            que[t1].left = i;
            que[i].right = t1;
            que[que[i].left].right = i;
            if(t1 == head){
                head = i;
            }
        }
    }
    int m;
    scanf("%d",&m);
    for(int i = 1; i<=m; i++) {
        int tmp;
        scanf("%d",&tmp);
        que[que[tmp].left].right = que[tmp].right;
        que[que[tmp].right].left = que[tmp].left;
        que[tmp].left = que[tmp].right = 0;
    }
    printf("%d",head);
    int tmp = head;
    while(que[tmp].right){
        tmp = que[tmp].right;
        printf(" %d",tmp);
    }
    return 0;
}

链表,插入和删除节点的操作可以推一下,缺一不可,确保逻辑的完整性

posted @ 2017-12-16 19:34  WenOI  阅读(233)  评论(0编辑  收藏  举报
水波背景