题目链接:【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
*/