提 前 (10.28 T3 模拟赛)

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84960730

题目

【问题描述】
这个题目标题的意思显然不是说这次模拟赛会提前结束或者会在考试结束前提前告知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;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84960730