【题目分析】

查找区间内出现次数大于一半的数字。

直接用主席树,线段树上维护区间大小,由于要求出现次数大于一半,每到一个节点可以分治下去。

时间复杂度(N+Q)logN

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5.  
  6. #include <set>
  7. #include <map>
  8. #include <string>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <iostream>
  12. #include <queue>
  13.  
  14. using namespace std;
  15.  
  16. #define maxn 500005
  17. #define mlog 30
  18. #define inf (0x3f3f3f3f)
  19.  
  20. int read()
  21. {
  22. int x=0,f=1; char ch=getchar();
  23. while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  24. while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
  25. return x*f;
  26. }
  27.  
  28. int rt[maxn],ls[maxn*mlog],rs[maxn*mlog],siz[maxn*mlog],idx=0;
  29.  
  30. int n,m,x,a[maxn];
  31.  
  32. int ins(int o,int l,int r,int x)
  33. {
  34. int k=++idx; siz[k]=siz[o]+1; int mid=(l+r)/2;
  35. if (l==r) return k;
  36. if (x<=mid) rs[k]=rs[o],ls[k]=ins(ls[o],l,mid,x);
  37. else ls[k]=ls[o],rs[k]=ins(rs[o],mid+1,r,x);
  38. return k;
  39. }
  40.  
  41. int query(int o1,int o2,int l,int r,int tim)
  42. {
  43. // printf("%d %d\n",l,r);
  44. if (l==r)
  45. {
  46. if (siz[o2]-siz[o1]>tim) return l;
  47. else return 0;
  48. }
  49. if (siz[ls[o2]]-siz[ls[o1]]>siz[rs[o2]]-siz[rs[o1]])
  50. return query(ls[o1],ls[o2],l,(l+r)/2,tim);
  51. else return query(rs[o1],rs[o2],(l+r)/2+1,r,tim);
  52. }
  53.  
  54. int main()
  55. {
  56. n=read();m=read();
  57. for (int i=1;i<=n;++i) a[i]=x=read(),rt[i]=ins(rt[i-1],1,n,x);
  58. // for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n");
  59. for (int i=1;i<=m;++i)
  60. {
  61. int l=read(),r=read();
  62. // printf("ask for %d to %d\n",l,r);
  63. if (l==r)
  64. {
  65. // printf("l == r\n");
  66. printf("%d\n",a[r]);
  67. }
  68. else printf("%d\n",query(rt[l-1],rt[r],1,n,(r-l+1)/2));
  69. }
  70. }

  

BZOJ 3542 [Poi2014]Couriers ——可持久化线段树的更多相关文章

  1. 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树

    为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...

  2. BZOJ-3524 Couriers 可持久化线段树

    可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Sol ...

  3. bzoj 2653 二分答案+可持久化线段树

    首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...

  4. bzoj 2653 middle (可持久化线段树)

    middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1981  Solved: 1097[Submit][Status][Discuss] D ...

  5. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

  6. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  7. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  8. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  9. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

随机推荐

  1. bootstrap清除拟态框内添加新HTML再打开时会有缓存现象

    $(function(){ $("#editor").on("hidden.bs.modal",function(){ //清除缓存方法 $(this).fin ...

  2. iOS 中CoreData的简单使用

    原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...

  3. php curl get post

    post有3种. 1.post方式 privatefunction send_post($url,$post_data){ $ch = curl_init($url); curl_setopt($ch ...

  4. iOS 多线程及其他补充

      NSOperation NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 NSInvocationOperation 如果直接执行NSInvocationOperatio ...

  5. supersr--NSURLSessionConfiguration-下载进度

    ////  ViewController.m//  下载进度 // //  Created by Super on 14/7/4. //  Copyright (c) 2014年 iOS. All r ...

  6. [Android Pro] CPU占用计算方法

    1: AVTest  CPU计算方法读取每个进程的 stat 文件 (/proc/<PID>/stat)计算采样间隔10min下utime的差值minusUtime,stime的差值min ...

  7. September 7th 2016 Week 37th Wednesday

    Patience is bitter, but its fruit is sweet. 忍耐是痛苦的,但它的果实却是甜蜜的. However, many may give up before they ...

  8. BigInteger类型的解析_超详细解析

    /*9876543210987654234522345 214748364723453452323452345 2147483647234523452323452345 181760911432744 ...

  9. C#学习笔记-----C#枚举中的位运算权限分配

    一.基础知识 什么是位运算? 用二进制来计算,1&2:这就是位运算,其实它是将0001与0010做位预算   得到的结果是 0011,也就是3  2.位预算有多少种?(我们就将几种我们权限中会 ...

  10. Unity依赖注入使用

    构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相 ...