zoukankan      html  css  js  c++  java
  • BZOJ-3524 Couriers 可持久化线段树

    可持久化线段树,其实就是类主席树了。。
    

    3524: [Poi2014]Couriers
    Time Limit: 20 Sec Memory Limit: 128 MB
    Submit: 1124 Solved: 390
    [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

    Source
    By Dzy

    可持久化线段树,类主席树,数组存储,前缀和处理出所求的。。

    code:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,siz;
    int root[500010],lc[10000010],rc[10000010],sum[10000010];
    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 l,int r,int x,int &y,int v)
    {
        y=++siz;
        sum[y]=sum[x]+1;
        if (l==r) return;
        lc[y]=lc[x]; rc[y]=rc[x];
        int mid=(l+r)>>1;
        if (v<=mid) build(l,mid,lc[x],lc[y],v);
               else build(mid+1,r,rc[x],rc[y],v);
    }
    
    int query(int L,int R)
    {
        int l=1,r=n;int mid=(l+r)>>1;int x,y,tmp=(R-L+1)>>1;
        x=root[L-1];y=root[R];
        while (l!=r)
            {
                if (sum[y]-sum[x]<=tmp) return 0;
                mid=(l+r)>>1;
                if (sum[lc[y]]-sum[lc[x]]>tmp) r=mid,x=lc[x],y=lc[y];
                else if (sum[rc[y]]-sum[rc[x]]>tmp) l=mid+1,x=rc[x],y=rc[y];
                        else return 0;
            }
        return l;
    }
    int main()
    {
        n=read(),m=read();
        for (int i=1; i<=n; i++)
            {
                int x=read();
                build(1,n,root[i-1],root[i],x);
            }
        for (int i=1; i<=m; i++)
            {
                int l=read(),r=read();
                printf("%d
    ",query(l,r)); 
            }
        return 0;
    }
  • 相关阅读:
    关于ArcGIS Server VS2010无法显示发布的地图服务
    NDK,动态链接库,JNI
    android开发中一些报错的解决方法
    查询死锁对象
    pb导入excel文件
    n_cst_ping在powerbuilder 11 中的变化,一面的程序可正常ping
    SQL拼音
    数据库优化
    android调用asp.net webservice,返回json结构
    iframe内部需要弹出浮层问题
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346206.html
Copyright © 2011-2022 走看看