zoukankan      html  css  js  c++  java
  • 主席树 Couriers

    【bzoj3524/2223】[Poi2014]Couriers

    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行,每行对应一个答案。/*

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int sum[10000010],ls[10000010],rs[100000010],root[500010];
    int n,m,sz;
    inline int read()
    {
    char ch=getchar();
    while(!(ch>='0'&&ch<='9'))ch=getchar();
    int x=0;
    while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}
    return x;
    }
    void update(int l,int r,int x,int &y,int v)
    {
    y=++sz;
    sum[y]=sum[x]+1;
    if(l==r)
    return;
    ls[y]=ls[x];
    rs[y]=rs[x];
    int mid=(l+r)>>1;
    if(v<=mid)
    update(l,mid,ls[x],ls[y],v);
    else
    update(mid+1,r,rs[x],rs[y],v);
    }
    int que(int L,int R)
    {
    int l=1,r=n,mid,x,y,tmp=((R-L+1)>>1);
    x=root[L-1];
    y=root[R];
    for(;l!=r;)
    {
    if(sum[y]-sum[x]<=tmp)
    return 0;
    mid=(l+r)>>1;
    if(sum[ls[y]]-sum[ls[x]]>tmp)
    {
    y=ls[y];
    x=ls[x];
    r=mid;
    }
    else if(sum[rs[y]]-sum[rs[x]]>tmp)
    {
    y=rs[y];
    x=rs[x];
    l=mid+1;
    }
    else
    return 0;
    }
    return l;
    }
    int main()
    {
    n=read();m=read();
    for(int i=1;i<=n;i++)
    {
    int x;
    x=read();
    update(1,n,root[i-1],root[i],x);
    }
    for(int i=0;i<m;i++)
    {
    int l,r;
    l=read();
    r=read();
    printf("%d ",que(l,r));
    }
    return 0;
    }*/

  • 相关阅读:
    Linux下删除某些非法字符文件名的文件
    华为面经之我的同学是个死神
    算法面经之华为
    【剑指offer】两个链表的第一个公共结点
    算法面经之百度
    【剑指offer】丑数
    【剑指offer】把数组排成最小的数
    【深度学习最优化方法】
    【矩阵范数与秩、正定】
    算法面经之大华+顺丰+爱奇艺
  • 原文地址:https://www.cnblogs.com/xydddd/p/5143942.html
Copyright © 2011-2022 走看看