这个题就是给你n个数, 然后给你m个t和r的序列t的取值是1或者2, 当为1的时候表示将n个数的前r个数升序排列, 当为2的时候表示将前n个数降序排列, 问你这m个操作后的序列是多少?首先可以肯定的是如果后面有个操作r大于前面的r那么前面的操作就可以忽略,根据这个性质我们可以将这m个操作变为按照r降序的操作然后在执行相应的操作, 具体操作见代码。
#include#include #include #include using namespace std;typedef pair pii;int n, m;int ai[200000 + 100];vector v;int main(){ scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) scanf("%d", &ai[i]); for(int i=0; i 0 && v.back().second<=r) v.pop_back(); v.push_back((pii){t, r}); } vector ans; for(int i=n; i>v[0].second; i--) ans.push_back(ai[i]); n = v[0].second; sort(ai+1, ai+1+n); int s = 1; for(int i=0; i+1 =n-(r1-r2)+1; j--) ans.push_back(ai[j]); n -= r1-r2; } else { for(int j=s; j<=s+(r1-r2)-1; j++) ans.push_back(ai[j]); s += r1-r2; } } int m = v.size()-1; if(v[m].first==1) for(int j=n; j>=s; j--) ans.push_back(ai[j]); else for(int j=s; j<=n; j++) ans.push_back(ai[j]); for(int i=ans.size()-1; i>=0; i--) printf("%d%c", ans[i], i==0?'\n':' '); return 0;}