zoukankan      html  css  js  c++  java
  • BZOJ 3524: [Poi2014]Couriers

    3524: [Poi2014]Couriers

    Time Limit: 20 Sec  Memory Limit: 256 MB
    Submit: 1905  Solved: 691
    [Submit][Status][Discuss]

    Description

    给一个长度为n的序列a。1≤a[i]≤n。
    m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。

    Input

    第一行两个数n,m。
    第二行n个数,a[i]。
    接下来m行,每行两个数l,r,表示询问[l,r]这个区间。

    Output

    m行,每行对应一个答案。

    Sample Input

    7 5
    1 1 3 2 3 4 3
    1 3
    1 4
    3 7
    1 7
    6 6

    Sample Output

    1
    0
    3
    0
    4

    HINT

    【数据范围】

    n,m≤500000


    2016.7.9重设空间,但未重测!


    Source

    By Dzy

    2017-03-29

    #include<cstdio>
    #include<algorithm>
    #define EF if(ch==EOF) return x; 
    using namespace std;
    const int N=5e5+5,M=N*20;
    int n,m,sz,a[N];
    int root[N],sum[M],ls[M],rs[M];
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void build(int &k,int l,int r){
        k=++sz;
        if(l==r) return ;
        int mid=l+r>>1;
        build(ls[k],l,mid);
        build(rs[k],mid+1,r);
    }
    void insert(int &k,int last,int l,int r,int p){
        k=++sz;
        sum[k]=sum[last]+1;
        if(l==r) return ;
        ls[k]=ls[last];
        rs[k]=rs[last];
        int mid=l+r>>1;
        if(p<=mid) insert(ls[k],ls[last],l,mid,p);
        else insert(rs[k],rs[last],mid+1,r,p);
    }
    int query(int k,int last,int l,int r,int kth){
        if(sum[k]-sum[last]<=kth) return 0;
        if(l==r) return l;
        int mid=l+r>>1;
        int cnt=sum[ls[k]]-sum[ls[last]];
        if(kth<sum[ls[k]]-sum[ls[last]]) return query(ls[k],ls[last],l,mid,kth);
        if(kth<sum[rs[k]]-sum[rs[last]]) return query(rs[k],rs[last],mid+1,r,kth);
        return 0;
    }
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++) a[i]=read();
    //    build(root[0],1,cnt);
        for(int i=1;i<=n;i++) insert(root[i],root[i-1],1,n,a[i]);
        for(int i=1,id,l,r,k;i<=m;i++){
            l=read(),r=read();k=(r-l+1)>>1;
            printf("%d
    ",query(root[r],root[l-1],1,n,k));
        }
        return 0;
    }
    #include<cstdio>
    using namespace std;
    const int N=5e5+10;
    const int M=N*20;
    int n,m,cnt,root[N],ls[M],rs[M],sum[M];
    void ins(int &y,int x,int l,int r,int val){
        y=++cnt;
        sum[y]=sum[x]+1;//这里存的是以y为根的线段树上1--n中有多少个数
        if(l==r) return ;
        int mid=l+r>>1;
        ls[y]=ls[x];rs[y]=rs[x];
        if(val<=mid) ins(ls[y],ls[x],l,mid,val);
        else ins(rs[y],rs[x],mid+1,r,val);
    }
    int query(int L,int R){
        int l=1,r=n,mid,val=(R-L+1)>>1;
        int y=root[R],x=root[L-1];
        while(l!=r){
            if(sum[y]-sum[x]<=val) return 0;
            mid=l+r>>1;
            if(sum[ls[y]]-sum[ls[x]]>val) r=mid,y=ls[y],x=ls[x];
            else if(sum[rs[y]]-sum[rs[x]]>val) l=mid+1,y=rs[y],x=rs[x];
            else return 0;
        }
        return l;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);
            ins(root[i],root[i-1],1,n,x);
        }
        for(int i=1,l,r;i<=m;i++){
            scanf("%d%d",&l,&r);
            printf("%d
    ",query(l,r));
        }
        return 0;
    }
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/shenben/p/6220357.html
Copyright © 2011-2022 走看看