zoukankan      html  css  js  c++  java
  • [Tjoi2016&Heoi2016]排序[01序列]

    4552: [Tjoi2016&Heoi2016]排序

    Time Limit: 60 Sec  Memory Limit: 256 MB
    Submit: 994  Solved: 546
    [Submit][Status][Discuss]

    Description

    在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题
    ,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排
    序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q
    位置上的数字。

    Input

    输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。1 <= n, m <= 10^5第二行为n个整
    数,表示1到n的一个全排列。接下来输入m行,每一行有三个整数op, l, r, op为0代表升序排序,op为1代表降序
    排序, l, r 表示排序的区间。最后输入一个整数q,q表示排序完之后询问的位置, 1 <= q <= n。1 <= n <= 10^5
    ,1 <= m <= 10^5
     

    Output

     输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。

    Sample Input

    6 3
    1 6 2 5 3 4
    0 1 4
    1 3 6
    0 2 4
    3

    Sample Output

    5

    HINT

     

    Source

     

     

    #include<cstdio>
    #include<cstring>
    #define lch k<<1
    #define rch k<<1|1
    using namespace std;
    const int N=1e5+5,M=N<<2;
    int n,m,p,a[N],q[N][3];
    int sum[M],tag[M];
    inline void opera(int k,int sz,int v){
        sum[k]=sz*v;
    }
    inline void pushdown(int k,int l,int r){
        if(~tag[k]){
            int mid=(l+r)>>1;
            tag[lch]=tag[k];opera(lch,mid-l+1,tag[k]);
            tag[rch]=tag[k];opera(rch,r-mid,tag[k]);
            tag[k]=-1;
        }
    }
    void change(int k,int l,int r,int x,int y,int v){
        if(x>y) return ;
        if(l==x&&r==y){
            opera(k,r-l+1,v);
            tag[k]=v;
            return ;
        }
        pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(y<=mid) change(lch,l,mid,x,y,v);
        else if(x>mid) change(rch,mid+1,r,x,y,v);
        else change(lch,l,mid,x,mid,v),change(rch,mid+1,r,mid+1,y,v);
        sum[k]=sum[lch]+sum[rch];
    }
    int query(int k,int l,int r,int x,int y){
        if(l==x&&r==y) return sum[k];
        pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(y<=mid) return query(lch,l,mid,x,y);
        else if(x>mid) return query(rch,mid+1,r,x,y);
        else return query(lch,l,mid,x,mid)+query(rch,mid+1,r,mid+1,y);
    }
    inline int work(int now){
        memset(sum,0,sizeof sum);
        memset(tag,-1,sizeof tag);
        for(int i=1;i<=n;i++) change(1,1,n,i,i,a[i]>=now);
        for(int i=1,t;i<=m;i++){
            t=query(1,1,n,q[i][1],q[i][2]);
            if(!q[i][0]){
                change(1,1,n,q[i][1],q[i][2]-t,0);
                change(1,1,n,q[i][2]-t+1,q[i][2],1);
            }
            else{
                change(1,1,n,q[i][1],q[i][1]+t-1,1);
                change(1,1,n,q[i][1]+t,q[i][2],0);
            }
        }
        return query(1,1,n,p,p);    
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=m;i++) scanf("%d%d%d",&q[i][0],&q[i][1],&q[i][2]);
        scanf("%d",&p);
        int l=1,r=n,mid,ans;
        while(l<=r){
            mid=(l+r)>>1;
            if(work(mid)) l=mid+1,ans=mid;
            else r=mid-1;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    【编程题目】左旋转字符串 ☆
    360測试开发笔试题(2016内推)
    start_kernel——boot_cpu_init及PER_CPU
    UVa 10673
    【面试】-Java基础知识
    Navgationcontroller 的pop
    别拿接口不当开发
    C++基础学习教程(三)
    安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理
    【动态树问题】LCT学习笔记
  • 原文地址:https://www.cnblogs.com/shenben/p/6856239.html
Copyright © 2011-2022 走看看