分析题意:
- 一对有n个数的数列,m次操作,每次操作的代号ti为1或2,并且有操作范围xi。
- 操作代号为1,将数列中下标从1到xi范围的数按升序排序。
- 操作代号为2,将数列中下标从1到xi范围的数按降序排序。
- 输出操作后的序列。
做法:
- 需要排序,则用快速排序sort。
- 每次遍历时按照当前要求进行操作。
优化:
不难发现从1到xi中,将会有重复操作,我们只需要把1到xi中范围最广的xi找出来,在进行排序,会起到去重的效果。
代码:
#include<bits/stdc++.h> using namespace std; int a[200010],t[200010],x[200010]; int n,m; bool cmp(int x,int y) { return x>y; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d%d",&t[i],&x[i]); int maxnxi=0; for (int i=m;i>=1;i--) { if (x[i]>maxnxi) maxnxi=x[i]; else t[i]=0;//找到此时最大的xi就可以将之前的重复操作舍去。 } for(int i=1;i<=m;i++) { if(t[i]==1) { sort(a+1,a+x[i]+1); } else if(t[i]==2) { sort(a+1,a+x[i]+1,cmp); } } for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
完结,谢谢观看。