NC220678. 跑步训练
描述
输入描述
第一行两个以空格分隔的整数。第一个表示队伍人数,第二个表示接下来会有次跑出。接下来会有行,表示每一次跑出的信息。每一行的第一个整数表示这一次跑出的人的编号,第二个整数表示这一次他后面和他一起跑的人数有个。
输出描述
一行个以空格分隔的整数依次代表队伍从头到尾的人员编号。
示例1
输入:
5 2 2 4 3 1
输出:
3 4 2 5 1
说明:
示例2
输入:
5 3 2 4 3 1 2 0
输出:
2 3 4 5 1
说明:
C++(clang++11) 解法, 执行用时: 55ms, 内存消耗: 1744K, 提交时间: 2021-05-08 16:58:58
#include<iostream> using namespace std; int n,q,i,j,x,y,head,pre[1000000],nxt[1000000]; int main(){ scanf("%d%d\n",&n,&q); head=1; for (i=1;i<n;i++) nxt[i]=i+1; for (i=2;i<=n;i++) pre[i]=i-1; for (;q--;){ scanf("%d%d\n",&x,&y); if (x==head) continue; for (i=x;y>0 && nxt[i];y--) i=nxt[i]; if (pre[x]) nxt[pre[x]]=nxt[i]; if (nxt[i]) pre[nxt[i]]=pre[x]; pre[head]=i; nxt[i]=head; head=x; pre[x]=0; } for (i=head,j=1;j<=n;j++,i=nxt[i]) printf("%d ",i); }