BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 1892 Solved: 683
[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
1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6
Sample Output
0
3
0
4
HINT
【数据范围】
n,m≤500000
复习一下普通主席树http://www.cnblogs.com/candy99/p/6160704.html
如何找出现次数大于(r-l+1)/2的数呢?
kth的过程中k不减就可以了,因为就是需要找一个叶子节点size>(r-l+1)/2
注意:本题数有重复,需要离散化去重
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+;
int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,Q,mp[N],m,l,r,a[N];
int Bin(int v){
int l=,r=m;
while(l<=r){
int mid=(l+r)>>;
if(v==mp[mid]) return mid;
if(v<mp[mid]) r=mid-;
else l=mid+;
}
return ;
}
struct node{
int lc,rc,size;
}t[N*];
int sz,root[N];
void ins(int &x,int l,int r,int num){
sz++;
t[sz]=t[x];x=sz;
++t[x].size;
if(l==r) return;
int mid=(l+r)>>;
if(num<=mid) ins(t[x].lc,l,mid,num);
else ins(t[x].rc,mid+,r,num);
}
int query(int i,int j,int k){//cishu>k
int l=,r=m;
while(l!=r){
int mid=(l+r)>>;
if(t[t[j].lc].size-t[t[i].lc].size>k) r=mid,i=t[i].lc,j=t[j].lc;
else if(t[t[j].rc].size-t[t[i].rc].size>k) l=mid+,i=t[i].rc,j=t[j].rc;
else return ;
}
return l;
}
int main(){
//freopen("in.txt","r",stdin);
n=read();Q=read();
for(int i=;i<=n;i++) mp[++m]=a[i]=read();
sort(mp+,mp++m);
int p=;
for(int i=;i<=m;i++) if(mp[i]!=mp[i-]) mp[++p]=mp[i];
m=p; for(int i=;i<=n;i++) root[i]=root[i-],ins(root[i],,m,Bin(a[i]));
while(Q--) l=read(),r=read(),printf("%d\n",mp[query(root[l-],root[r],(r-l+)/)]);
}
BZOJ 3524: [Poi2014]Couriers [主席树]的更多相关文章
- 3524: [Poi2014]Couriers -- 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MB Description 给一个长度为n的序列a.1≤a[i]≤n.m组 ...
- BZOJ 3524 [POI2014]KUR-Couriers (主席树)
题目大意:给你一个序列,求某个区间出现次数大于一半的数是什么 主席树裸题,刷刷水题提升自信= = #include <cstdio> #include <cstring> #i ...
- BZOJ2223/3524:[POI2014] Couriers(主席树)
Description 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0 ...
- [BZOJ2223][BZOJ3524][Poi2014]Couriers 主席树
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2436 Solved: 960[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- 主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR-Couriers
题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个.我们对序列做主席树,每个节点记录出现的次数和(sum).(这里忽略版本差值问题) ...
- 【BZOJ3524/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...
- BZOJ3524[Poi2014]Couriers——主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
随机推荐
- webapi修改tt模板给字段添加JsonIgnore特性解决转换json循环引用问题
0.问题描述 EF生成的model带有导航属性,则json序列化会报循环引用错误,尝试如下 protected void Application_Start() { GlobalConfigurati ...
- oracle与sqlserver部分区别
oracle和sqlserver的区别:1,执行修改操作要接commit,不然数据仅仅只是查看,并不是提交数据2,oracle不能使用select 字段 这种查看方式查看数据:3,oracle存储过程 ...
- 疯狂Android讲义 - 学习笔记(三)
Android的事件处理 3.1 Android提供了两套事件处理机制:基于监听的事件处理.基于回调的事件处理. 3.2 基于监听的事件处理 3.2.1 监听的处理模型 主要涉及三类对象:Event ...
- SQL SERVER 2008 R2数据库出现“远程过程调用失败”(0x800706be)错误,怎么办!!
以前SQL Server 2008 不能登陆的时候,总是通过“计算机管理”→“SQL Server服务”更改一下,"SQL Server(MSSQLSERVER)". 可是现在出现 ...
- [翻译]用 Puppet 搭建易管理的服务器基础架构(1)
我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第一部分. 原文地址:http://blog.jobbole.com/87679/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...
- jQuery实用小技巧--输入框文字获取和失去焦点
<input id="txt" class="text1" type="text" /> <script src=& ...
- Linux安全基础:shell及一些基础命令
1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourn ...
- AFNetWorking https请求 SSL认证 自制证书
1.服务器会给一个证书,一般为.pem格式证书 2.将.pem格式的证书转换成.cer格式的证书 打开电脑自带终端 ,进入到桌面 cd Desktop 回车回到桌面Desktop Admin$ 输入 ...
- 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)
邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...
- sqlserver2012更改文件组
1.查看文件组 sql语句 SELECT Data_located_on_filegroup = fg.groupname, Table_name = obj.name FROM sysfilegro ...