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+,M=N*;
int n,m,sz,a[N];
int root[N],sum[M],ls[M],rs[M];
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void build(int &k,int l,int r){
k=++sz;
if(l==r) return ;
int mid=l+r>>;
build(ls[k],l,mid);
build(rs[k],mid+,r);
}
void insert(int &k,int last,int l,int r,int p){
k=++sz;
sum[k]=sum[last]+;
if(l==r) return ;
ls[k]=ls[last];
rs[k]=rs[last];
int mid=l+r>>;
if(p<=mid) insert(ls[k],ls[last],l,mid,p);
else insert(rs[k],rs[last],mid+,r,p);
}
int query(int k,int last,int l,int r,int kth){
if(sum[k]-sum[last]<=kth) return ;
if(l==r) return l;
int mid=l+r>>;
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+,r,kth);
return ;
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
// build(root[0],1,cnt);
for(int i=;i<=n;i++) insert(root[i],root[i-],,n,a[i]);
for(int i=,id,l,r,k;i<=m;i++){
l=read(),r=read();k=(r-l+)>>;
printf("%d\n",query(root[r],root[l-],,n,k));
}
return ;
}
#include<cstdio>
using namespace std;
const int N=5e5+;
const int M=N*;
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]+;//这里存的是以y为根的线段树上1--n中有多少个数
if(l==r) return ;
int mid=l+r>>;
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+,r,val);
}
int query(int L,int R){
int l=,r=n,mid,val=(R-L+)>>;
int y=root[R],x=root[L-];
while(l!=r){
if(sum[y]-sum[x]<=val) return ;
mid=l+r>>;
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+,y=rs[y],x=rs[x];
else return ;
}
return l;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
ins(root[i],root[i-],,n,x);
}
for(int i=,l,r;i<=m;i++){
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
return ;
}

BZOJ 3524: [Poi2014]Couriers的更多相关文章

  1. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  2. 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers

    题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...

  3. BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...

  4. BZOJ 3524 [Poi2014]Couriers(可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...

  5. 【刷题】BZOJ 3524 [Poi2014]Couriers

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

  6. 3524: [Poi2014]Couriers -- 主席树

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...

  7. 【BZOJ】3524: [Poi2014]Couriers

    [算法]主席树 [题解]例题,记录和,数字出现超过一半就递归查找. 主席树见[算法]数据结构 #include<cstdio> #include<algorithm> #inc ...

  8. 【BZOJ】3524 [POI2014] Couriers(主席树)

    题目 传送门:QWQ 传送到洛谷QWQ 分析 把求区间第k大的改一改就ok了. 代码 #include <bits/stdc++.h> using namespace std; ; ], ...

  9. BZOJ 3542 [Poi2014]Couriers ——可持久化线段树

    [题目分析] 查找区间内出现次数大于一半的数字. 直接用主席树,线段树上维护区间大小,由于要求出现次数大于一半,每到一个节点可以分治下去. 时间复杂度(N+Q)logN [代码] #include & ...

随机推荐

  1. iOS 关于手势

    不同视图不能同时添加相同手势!

  2. 【代码笔记】iOS-点击顶点处,弹出另一个小的界面

    一,效果图. 二,文件目录. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewControlle ...

  3. 苹果企业账号打包发布APP流程详解

    原文链接:http://www.cnblogs.com/mddblog/p/4718228.html 一.通过企业账号申请证书 1 Certificate Signing Request (CSR)文 ...

  4. 免费开发者证书真机调试App ID失效问题:"Unable to add App ID because the '10' App ID limit in '7' days has been exceeded."解决方案(5月5号)

    免费开发者证书真机调试App ID失效问题:"Unable to add App ID because the '10' App ID limit in '7' days has been ...

  5. scanf函数

    一. 变量的内存分析 1. 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. 1> 内存以“字节为单位” 0x表示的是十六进制,不用过于纠结,能看懂这些 ...

  6. linux下安装jdk+tomcat+eclipse+mysql

    我的环境:主机是win7的,虚拟机是VWare  Workstation 6.0   ,linux系统为Red Hat Enterprise  Linux 5 64位 各软件版本:jdk是jdk-6u ...

  7. 让我们喝喝下午茶,聊聊AJAX和JSON

    1.AJAX     [1] AJAX简介         > 全称:Asynchronous JavaScript And XML         > 直译:异步的JavaScript和 ...

  8. #winhec# 开发人员刷屏看点 (视频)

    今天大家已经被winhec刷屏了,本来不想写这篇了,但看了所有的文章,大家关注的都是windows 10的那些新功能,小米win10刷机,联想千元手机,小娜啥的.对于keynote上第二部分 Don ...

  9. 6、软件配置工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件配置管理工程师的工作也是贯穿整个项目过程的.其主要针对项目中的各种文档.技术源码等等进行归档控制.一般的配置项比如需求说明书,概要设计,详细设计,测试文档,用户手册等,还有源代码管理,数据库文档文 ...

  10. 网页实时聊天之js和jQuery实现ajax长轮询

    众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...