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