隊列安排

題目描述
一個學校里老師要將班上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;
}

鏈表,插入和刪除節點的操作可以推一下,缺一不可,確保邏輯的完整性

發佈了50 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章