CF 631C. Report

题目描述:给你n个数每次排前m个数(可能降序可能升序)问你最后出来是什么样子的;
分析:它的顺序只跟后面最大的m有关  比如3   4  那么前三个不管怎么排对我排前4个都没影响  
            总结下这种规律题,首先多用电脑去找规律 ,也就是打表,其次一般都有很多条件什么的,找规律也就是把条件逐一合并,到最后容易实现
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int>  P;
int a[200004];
int b[200004];
int main(){
//    freopen("1.txt","r",stdin);
    int n,m;
    cin>>n>>m;
    vector<P> sta;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        while(!sta.empty()&&sta.back().second<=y) sta.pop_back();
        sta.push_back(make_pair(x,y));
    }
    if(m!=1||sta[0].first==1)sort(a+1,a+sta[0].second+1,less<int>());
    else sort(a+1,a+sta[0].second+1,greater<int>());
    for(int i=1;i<=sta[0].second;i++)b[i]=a[i];
    int mi=1,ma=sta[0].second;
    if(m!=1)for(int i=0,sz=sta.size();i<sz;i++){
        if(i==sz-1){
            if(sta[i].first==1) for(int j=1;j<=sta[i].second;j++) a[j]=b[mi++];
            else for(int j=1;j<=sta[i].second;j++) a[j]=b[ma--];
            break;
        }
        int r=sta[i].second,flag=sta[i].first,l=sta[i+1].second;
        for(int j=r;j>l;j--)
            if(flag==1) a[j]=b[ma--];
            else a[j]=b[mi++];
    }
    for(int i=1;i<=n;i++){
        cout<<a[i];
        if(i!=n)cout<<' ';
        else cout<<endl;
    }
}



全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务