BZOJ3524:[POI2014]Couriers
浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3524
假设数列不是一开始就给你的,而是一次一次修改操作让你插入数值\(x\),而询问是问你从第\(L\)次插入到第\(R\)次操作间,有没有哪个数值插入次数超过\((R-L+1)/2\),把题意这么一转化,就很好用主席树写了。
我们可以在值域上建立主席树,每个结点统计值域在\([l,r]\)内的数字有多少个。那么只需要用第\(r\)个版本的主席树的\(cnt\)减去第\(l-1\)个版本的主席树的\(cnt\),就是操作\([L,R]\)里插入了多少次值域在\([l,r]\)的数字。如果\([l,mid]\)的次数大于\((R-L+1)/2\)那么答案就在\([l,mid]\),同理可以去判断答案是否在\([mid+1,r]\)内,如果都不满足,那么就不存在这样的数值,直接返回\(0\)就行了。
时间复杂度:\(O((n+m)logn)\)
空间复杂度:\(O(nlogn)\)
代码如下:
#include <cstdio>
using namespace std;
const int maxn=5e5+5;
int n,m;
int rt[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct tree_node {
int cnt,ls,rs;
};
struct Chairman_tree {
int tot;
tree_node tree[maxn*20];
void ins(int lst,int &now,int l,int r,int pos) {
now=++tot;tree[now]=tree[lst];tree[now].cnt++;//先把左右儿子信息全部继承下来,然后区间内数字个数加一
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)ins(tree[lst].ls,tree[now].ls,l,mid,pos);//新建左儿子
else ins(tree[lst].rs,tree[now].rs,mid+1,r,pos);//新建右儿子
}
int query(int L,int R,int l,int r,int limit) {
if(l==r) {
if(tree[R].cnt-tree[L].cnt>limit)return l;//记得判断
else return 0;
}
int mid=(l+r)>>1;
int tmp1=tree[tree[R].ls].cnt-tree[tree[L].ls].cnt;
int tmp2=tree[tree[R].rs].cnt-tree[tree[L].rs].cnt;
if(tmp1>limit)return query(tree[L].ls,tree[R].ls,l,mid,limit);
if(tmp2>limit)return query(tree[L].rs,tree[R].rs,mid+1,r,limit);
return 0;//同题解所述
}
}T;
int main() {
n=read(),m=read();
for(int i=1;i<=n;i++) {
int x=read();
T.ins(rt[i-1],rt[i],1,n,x);//rt[i]表示第i个版本的主席树
}
for(int i=1;i<=m;i++) {
int l=read(),r=read(),limit=(r-l+1)>>1;
int ans=T.query(rt[l-1],rt[r],1,n,limit);
printf("%d\n",ans);
}
return 0;
}
BZOJ3524:[POI2014]Couriers的更多相关文章
- bzoj3524/2223 [Poi2014]Couriers
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 http://www.lydsy.com/JudgeOnline/problem.ph ...
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- [bzoj3524==bzoj2223][Poi2014]Couriers/[Coci 2009]PATULJCI——主席树+权值线段树
题目大意 给定一个大小为n,每个数的大小均在[1,c]之间的数列,你需要回答m个询问,其中第i个询问形如\((l_i, r_i)\),你需要回答是否存在一个数使得它在区间\([l_i,r_i]\)中出 ...
- 【BZOJ3524】 [Poi2014]Couriers
Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. ...
- 【BZOJ3524/2223】[Poi2014]Couriers 主席树
[BZOJ3524][Poi2014]Couriers Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大 ...
- [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: 1892 Solved: 683[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).(这里忽略版本差值问题) ...
随机推荐
- spring源码解析之IOC容器(一)
学习优秀框架的源码,是提升个人技术水平必不可少的一个环节.如果只是停留在知道怎么用,但是不懂其中的来龙去脉,在技术的道路上注定走不长远.最近,学习了一段时间的spring源码,现在整理出来,以便日后温 ...
- java中的 equals + hashCode
[0]README 0.1)本文转自 core java volume 1, 旨在理清 equals + hashCode方法: [1]equals方法 1.1) Object中的 equals 方法 ...
- 【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥
[BZOJ1853][Scoi2010]幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那 ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 【BZOJ4653】[Noi2016]区间 双指针法+线段树
[BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...
- EasyDSS RTMP流媒体解决方案之直播录像自动清理方案
本文转自Marvin的博客: http://blog.csdn.net/marvin1311/article/details/78660592 EasyDSS_Solution直播录像清理 直播录像, ...
- The goroutine scheduler is not preemptive.
go - Why is time.sleep required to run certain goroutines? - Stack Overflow https://stackoverflow.co ...
- Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库
ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...
- discuz论坛搬家
很多站长第一次做网站的时候,无奈选择了速度不是很稳定的空间,慢慢会发现有很多物美价廉速度相当快的空间 这个时候,站长在网站搬家的过程中就会遇到很多困难,今天老袋鼠给大家详细讲解一下discuz论坛搬家 ...
- testng testcase失败重试
简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ...