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?'
':' ');
    return 0;
}
原文地址:https://www.cnblogs.com/xingxing1024/p/5243907.html