CodeForces 631C Report(找规律)

题目链接:【CodeForces 631C】

长度是n的数列,m个次访问,两种操作:1、t=1,将数列1~r从小到大排序;2、t=2,将数列1~r从大到小排列。输出最后得到的数列

如果i>j&&ri>rj,那么i之前的操作都是无效的,所以我们可以根据这个删选t、r,因此第一个r(记为R)肯定是最大的

数组a存的是原数列

数组a[j](R<j<=n)这部分是不变的,变的只是1~R这一块(用数组b记录),那就从R开始往前推出最终的数组a

将数组b从小到大排序

仔细找找规律,想象一下我们可以发现这个规律:

访问i时,如果i-1的t等于1,数组a的后几位就是数组b的后几位,否则数组a的后几位就是数组b的前几位

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[2*N], b[2*N], t[2*N], r[2*N];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n; i++) 
	{
		scanf("%d", &a[i]);
		b[i] = a[i];
	}
	int ti, ri, len=0;
	for(int i=0; i<m; i++)
	{
		scanf("%d%d", &ti, &ri);
		while(len && ri>=r[len-1]) len--;
		t[len]=ti, r[len]=ri, len++;
	}
	r[len++]=0;
	sort(b+1, b+1+r[0]);
	int lb=1, rb=r[0];
	for(int i=1; i<len; i++)
	{
		for(int j=r[i-1]; j>r[i]; j--)
		{
			if(t[i-1]==1) a[j]=b[rb--];
			else a[j]=b[lb++];
		} 
	}
	printf("%d", a[1]);
	for(int i=2; i<=n; i++)
	{
		printf(" %d", a[i]);
	}
	printf("\n");
	return 0;
}
/*
10 5
2 4 3 6 9 7 10 8 1 5
2 9
2 8
1 6
2 4
1 2
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章