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

Solution

维护数字出现次数——主席树

同样用主席树维护\(sum\)

每次查询的时候选择满足条件的往下走就行了

因为一段数列中出现次数大于一半的至多只会有一个,所以这样暴力做的复杂度是正确的

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define db double
  4. #define ld long double
  5. #define Mid ((l+r)>>1)
  6. #define lson l,Mid
  7. #define rson Mid+1,r
  8. const int MAXN=500000+10;
  9. int n,m,A[MAXN];
  10. std::vector<int> V;
  11. std::map<int,int> M;
  12. struct ChairMan_Tree{
  13. int cnt,lc[MAXN<<5],rc[MAXN<<5],sum[MAXN<<5],root[MAXN];
  14. inline void init()
  15. {
  16. cnt=0;
  17. memset(lc,0,sizeof(lc));
  18. memset(rc,0,sizeof(rc));
  19. memset(sum,0,sizeof(sum));
  20. }
  21. inline void Build(int &rt,int l,int r)
  22. {
  23. rt=++cnt;
  24. sum[rt]=0;
  25. if(l==r)return ;
  26. Build(lc[rt],lson);
  27. Build(rc[rt],rson);
  28. }
  29. inline void Insert(int &rt,int l,int r,int last,int pos)
  30. {
  31. rt=++cnt;
  32. sum[rt]=sum[last]+1;
  33. lc[rt]=lc[last];
  34. rc[rt]=rc[last];
  35. if(l==r)return ;
  36. else
  37. {
  38. if(pos<=Mid)Insert(lc[rt],lson,lc[last],pos);
  39. else Insert(rc[rt],rson,rc[last],pos);
  40. }
  41. }
  42. inline int Query(int now,int last,int l,int r,int k)
  43. {
  44. if(sum[now]-sum[last]<=k)return 0;
  45. if(l==r)return l;
  46. else
  47. {
  48. if(sum[lc[now]]-sum[lc[last]]>k)return Query(lc[now],lc[last],lson,k);
  49. else return Query(rc[now],rc[last],rson,k);
  50. }
  51. }
  52. };
  53. ChairMan_Tree T;
  54. template<typename T> inline void read(T &x)
  55. {
  56. T data=0,w=1;
  57. char ch=0;
  58. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  59. if(ch=='-')w=-1,ch=getchar();
  60. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  61. x=data*w;
  62. }
  63. template<typename T> inline void write(T x,char c='\0')
  64. {
  65. if(x<0)putchar('-'),x=-x;
  66. if(x>9)write(x/10);
  67. putchar(x%10+'0');
  68. if(c!='\0')putchar(c);
  69. }
  70. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  71. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  72. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  73. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  74. inline void discre()
  75. {
  76. sort(V.begin(),V.end());
  77. V.erase(unique(V.begin(),V.end()),V.end());
  78. for(register int i=1;i<=n;++i)
  79. {
  80. int pre=A[i];
  81. A[i]=lower_bound(V.begin(),V.end(),A[i])-V.begin()+1;
  82. M[A[i]]=pre;
  83. }
  84. }
  85. int main()
  86. {
  87. read(n);read(m);
  88. for(register int i=1;i<=n;++i)
  89. {
  90. read(A[i]);
  91. V.push_back(A[i]);
  92. }
  93. discre();
  94. T.init();
  95. T.Build(T.root[0],1,n);
  96. for(register int i=1;i<=n;++i)T.Insert(T.root[i],1,n,T.root[i-1],A[i]);
  97. while(m--)
  98. {
  99. int l,r;
  100. read(l);read(r);
  101. write(T.Query(T.root[r],T.root[l-1],1,n,(r-l+1)/2),'\n');
  102. }
  103. return 0;
  104. }

【刷题】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

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

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

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

  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(可持久化线段树)

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

  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 3524 [POI2014]KUR-Couriers (主席树)

    题目大意:给你一个序列,求某个区间出现次数大于一半的数是什么 主席树裸题,刷刷水题提升自信= = #include <cstdio> #include <cstring> #i ...

随机推荐

  1. WebGL之shaderToy初使用

    做图形就要玩shader,我的shader进阶之路,从学习怎么使用shaderToy开始.首先介绍我是看哪篇文章学习的,给出参考文章地址:https://blog.csdn.net/xufeng099 ...

  2. 云计算时代,传统企业 IT 从业者如何做好转型?

    本文来源于国外社区 DZone,作者 Dennis O'Reilly 撰写过多篇关于云计算.混合云等内容的文章,本文内容围绕云计算时代,企业纷纷上云,传统 IT 从业者如何做好转型. 本文由“数梦工场 ...

  3. 最新Microsoft Edge!使用chromium内核

    2018年11月,微软宣布其Edge浏览器将采用Chromium引擎,意味着微软的Edge浏览器以失败告终. 但令人振奋的是,新版Edge也许会“死而复生”.在使用了Chromium内核后,Edge各 ...

  4. python—启动自带shell时报错(丢失api-ms-win-crt-runtime-l1-1-0.dll)已解决

    备注: 有的伙伴安装完1后重启,问题可以解决,summer儿在安装完1依然未能解决,于是又进行了2的安装再次重启后问题解决!! 1,安装vc-redist.x64,微软官网搜索免费下载,安装后重启. ...

  5. dvwa——命令注入&文件包含

    命令注入 commond_injection 源码.分析.payload: low: <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input ...

  6. python之multiprocessing创建进程

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...

  7. 常用DB2命令

    建库 db2 territory CN on 建库到指定位置 db2 create database OADB on D: using codeset GBK territory CN 列出所有数据库 ...

  8. 记事本APP之Alpha报告

    项目名称 记事本APP 项目版本 Alpha版本 负责人 北京航空航天大学计算机学院 Echo软件团队 联系方式 http://www.cnblogs.com/echo-buaa/ 要求发布日期 20 ...

  9. 面向对象OO第1-3次作业总结

    面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...

  10. Java每日学习笔记1

    单选按钮 JRadioButton radioButton1 = new JRadioButton("Java");// 创建单选按钮 contentPane.add(radioB ...