博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj3524】[Poi2014]Couriers 主席树
阅读量:5025 次
发布时间:2019-06-12

本文共 1410 字,大约阅读时间需要 4 分钟。

题目描述

给一个长度为n的序列a。1≤a[i]≤n。

m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。

输入

第一行两个数n,m。

第二行n个数,a[i]。
接下来m行,每行两个数l,r,表示询问[l,r]这个区间。

输出

m行,每行对应一个答案。

样例输入

7 5

1 1 3 2 3 4 3
1 3
1 4
3 7
1 7
6 6

样例输出

1

0
3
0
4


题解

主席树

同bzoj2223,也不需要离散化。

bzoj2223题解:http://www.cnblogs.com/GXZlegend/p/6292609.html

#include 
int si[10000010] , lp[10000010] , rp[10000010] , root[500010] , tot;void pushup(int x){ si[x] = si[lp[x]] + si[rp[x]];}void ins(int x , int &y , int l , int r , int p){ y = ++tot; if(l == r) { si[y] = si[x] + 1; return; } int mid = (l + r) >> 1; if(p <= mid) rp[y] = rp[x] , ins(lp[x] , lp[y] , l , mid , p); else lp[y] = lp[x] , ins(rp[x] , rp[y] , mid + 1 , r , p); pushup(y);}int query(int x , int y , int l , int r , int p){ if(l == r) return l; int mid = (l + r) >> 1; if(si[lp[y]] - si[lp[x]] > p) return query(lp[x] , lp[y] , l , mid , p); if(si[rp[y]] - si[rp[x]] > p) return query(rp[x] , rp[y] , mid + 1 , r , p); return 0;}int main(){ int n , m , i , a , b; scanf("%d%d" , &n , &m); for(i = 1 ; i <= n ; i ++ ) { scanf("%d" , &a); ins(root[i - 1] , root[i] , 1 , n , a); } while(m -- ) { scanf("%d%d" , &a , &b); printf("%d\n" , query(root[a - 1] , root[b] , 1 , n , (b - a + 1) >> 1)); } return 0;}

转载于:https://www.cnblogs.com/GXZlegend/p/6292615.html

你可能感兴趣的文章
指针从函数内部带回返回值
查看>>
在使用webView播放flash或视频文件时无法关闭声音的问题
查看>>
redhat 7 源码安装 mysql5.5.49
查看>>
CCP浅谈
查看>>
NAT虚拟网络配置
查看>>
c#部分---需要实例化的内容;
查看>>
销售类
查看>>
技术项目,问题
查看>>
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
web前端优化
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>