1. 程式人生 > >提 前 (10.28 T3 模擬賽)

提 前 (10.28 T3 模擬賽)

題目

【問題描述】
這個題目標題的意思顯然不是說這次模擬賽會提前結束或者會在考試結束前提前告知solution等等——而是用來描述在序列上的一個操作。
現在有一個長度為n的數列,第i個數字即為正整數i,在這個序列上只有一種操作:提前操作——將一個數從其當前的位置提到序列的最前面,在該數之前的數依次後移一位,比如在序列1 2 3 4 5上將數字4提前,那麼就會得到序列4 1 2 3 5,之後如果再將數字2提前,那麼便得到序列2 4 1 3 5。
現在給定一系列的提前操作,你的任務就是執行這些操作並且輸出執行這些操作之後最終的序列。

【輸入格式】
每個測試點第一行一個正整數T,表示該測試點內的資料組數。
接下來T組資料,每組資料第一行兩個正整數n,m,表示序列長度以及提前操作的數量,接下來m行每行一個正整數i,表示將序列中的正整數i提到序列的最前面。

【輸出格式】
對每組資料輸出一行n個用空格隔開的正整數,描述該組資料的m個操作執行後所得到的序列。

【輸入輸出樣例】

forward. in forward.out
2 2 4 1 3 5
5 2 5 3 1 2 4
4
2
5 3
1
3
5

【樣例解釋】
第一組資料即為樣例。
第二組資料:1 2 3 4 5->1 2 3 4 5->3 1 2 4 5->5 3 1 2 4。

【資料規模與約定】
對於50%的資料,有1≤n,m≤2000。
對於100%的資料,有1≤n,m≤50000,1≤T≤6。

程式碼

#include<bits/stdc++.h>
using namespace std;
int i,now,T,t;
int n,m,prev[50010],next[50010];
int main()
{
	for(cin>>T;T;
--T) { cin>>n>>m; for(i=0;i<=n;++i) { next[i]=i+1; prev[i]=i-1; } for(i=1;i<=m;++i) { cin>>t; next[prev[t]]=next[t]; prev[next[t]]=prev[t]; prev[next[0]]=next[0]; next[t]=next[0]; next[0]=t; prev[t]=0; } now=next[0]; while(now!=n+1) { printf("%d ",now); now=next[now]; } printf("\n"); } return 0; }