zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    linux shell 总结
    python小结
    python与execl的读写
    利用burpsuits暴力破解登陆界面
    python之函数的使用
    Sublime text怎么识别input函数
    ping的禁止
    Hbase的配置与使用
    JAVA 利用反射自定义数据层框架
    JAVA实现网页上传头像
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5243907.html
Copyright © 2011-2022 走看看