http://cogs.pro:8080/cogs/problem/problem.php?pid=1763

二分答案x

把区间内>=x的数设为1,<x的数设为-1

左端点在[a,b]之间,右端点在[c,d]之间的子序列中,若中位数>=x,

那么 [b+1,c-1]的区间和+[a,b]的最大右子段和+[c,d]的最大左子段和>=0

查询可以用线段树

多组询问,不能每一次二分都重设1和-1

所以用主席树

其中第i棵线段树表示<=i的都被设成了-1

因为主席树是线段树的前缀和,所以一次修改只需要改第i棵线段树,就可以得到<=i的都被设成-1的线段树

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4.  
  5. #define N 20001
  6.  
  7. using namespace std;
  8.  
  9. int n;
  10.  
  11. pair<int,int>a[N];
  12.  
  13. int cnt;
  14. int root[N],lc[N*],rc[N*];
  15.  
  16. int q[];
  17.  
  18. struct node
  19. {
  20. int sum,lmax,rmax;
  21.  
  22. node operator + (node p)
  23. {
  24. node c;
  25. c.sum=sum+p.sum;
  26. c.lmax=max(lmax,sum+p.lmax);
  27. c.rmax=max(p.rmax,rmax+p.sum);
  28. return c;
  29. }
  30.  
  31. }e[N*],zero;
  32.  
  33. void read(int &x)
  34. {
  35. x=; char c=getchar();
  36. while(!isdigit(c)) c=getchar();
  37. while(isdigit(c)) { x=x*+c-''; c=getchar(); }
  38. }
  39.  
  40. void build(int &k,int l,int r)
  41. {
  42. k=++cnt;
  43. if(l==r)
  44. {
  45. e[k].sum=e[k].lmax=e[k].rmax=;
  46. return;
  47. }
  48. int mid=l+r>>;
  49. build(lc[k],l,mid);
  50. build(rc[k],mid+,r);
  51. e[k]=e[lc[k]]+e[rc[k]];
  52. }
  53.  
  54. void change(int pre,int &k,int l,int r,int pos)
  55. {
  56. k=++cnt;
  57. if(l==r)
  58. {
  59. e[k].sum=e[k].lmax=e[k].rmax=-;
  60. return;
  61. }
  62. int mid=l+r>>;
  63. if(pos<=mid)
  64. {
  65. rc[k]=rc[pre];
  66. change(lc[pre],lc[k],l,mid,pos);
  67. }
  68. else
  69. {
  70. lc[k]=lc[pre];
  71. change(rc[pre],rc[k],mid+,r,pos);
  72. }
  73. e[k]=e[lc[k]]+e[rc[k]];
  74. }
  75.  
  76. node query(int k,int l,int r,int opl,int opr)
  77. {
  78. if(opl>opr) return zero;
  79. if(l>=opl && r<=opr) return e[k];
  80. int mid=l+r>>;
  81. if(opr<=mid) return query(lc[k],l,mid,opl,opr);
  82. if(opl>mid) return query(rc[k],mid+,r,opl,opr);
  83. return query(lc[k],l,mid,opl,opr)+query(rc[k],mid+,r,opl,opr);
  84. }
  85.  
  86. bool check(int pos)
  87. {
  88. if(query(root[pos],,n,q[],q[]).rmax+query(root[pos],,n,q[]+,q[]-).sum+query(root[pos],,n,q[],q[]).lmax>=) return true;
  89. return false;
  90. }
  91.  
  92. int main()
  93. {
  94. freopen("nt2012_middle.in","r",stdin);
  95. freopen("nt2012_middle.out","w",stdout);
  96. read(n);
  97. for(int i=;i<=n;++i)
  98. {
  99. read(a[i].first);
  100. a[i].second=i;
  101. }
  102. sort(a+,a+n+);
  103. build(root[],,n);
  104. for(int i=;i<=n;++i) change(root[i-],root[i],,n,a[i].second);
  105. int m;
  106. read(m);
  107. int ans=;
  108. int l,r,mid;
  109. while(m--)
  110. {
  111. for(int i=;i<;++i)
  112. {
  113. read(q[i]);
  114. q[i]+=ans;
  115. q[i]%=n;
  116. q[i]++;
  117. }
  118. sort(q,q+);
  119. l=,r=n;
  120. while(l<=r)
  121. {
  122. mid=l+r>>;
  123. if(check(mid-)) ans=mid,l=mid+;
  124. else r=mid-;
  125. }
  126. ans=a[ans].first;
  127. cout<<ans<<'\n';
  128. }
  129. }

1763. [国家集训队2012]middle

★★★☆   输入文件:nt2012_middle.in   输出文件:nt2012_middle.out   简单对比
时间限制:3 s   内存限制:1024 MB

middle(陈立杰)
时间限制:3.0s   内存限制:1.0GB

【大意】

一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。
给你一个长度为n的序列s。
回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a<b<c<d。
位置也从0开始标号。
我会使用一些方式强制你在线。

【输入格式】

第一行序列长度n。
接下来n行按顺序给出a中的数。
接下来一行Q。
然后Q行每行a,b,c,d,我们令上个询问的答案是x(如果这是第一个询问则x=0)。
令数组q={(a+x)%n,(b+x)%n,(c+x)%n,(d+x)%n}。
将q从小到大排序之后,令真正的要询问的a=q[0],b=q[1],c=q[2],d=q[3]。
输入保证满足条件。

【输出格式】

Q行依次给出询问的答案。

【数据规模和约定】

0:n,Q<=100
1,...,5:n<=2000
0,...,19:n<=20000,Q<=25000

【样例输入】

5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0

【样例输出】

271451044
271451044
969056313

[国家集训队2012]middle的更多相关文章

  1. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...

  2. [国家集训队2012]JZPFAR

    [国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...

  3. [国家集训队2012]tree(陈立杰)

    [国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...

  4. 「国家集训队」middle

    「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...

  5. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  6. 【国家集训队2012】tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:  + u v c:将u到v的路径上的点的权值都加上自然数c:  - u1 v1 u2 ...

  7. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  8. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  9. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

随机推荐

  1. 用Beyond Compare比较文本时,忽略不重要文本的方法

    Beyond Compare是一款好用的文本比较工具,可以比较纯文本文件.源代码和HTML,Word文档.Adobe和pdf文件.在使用Beyond Compare比较文本文件时,有些不重要的文本差异 ...

  2. fiddler之会话数据的修改

    fiddler之会话数据的修改 fiddler记录http的请求,并且针对特定的http请求,可以分析请求数据.修改数据.调试web系统等,功能十分强大.本篇主要讲两种修改的数据的方法,断点和Unlo ...

  3. mark一下岗位

    一.中国移动杭州研发中心——测试开发工程师 https://campusresume.zhaopin.com/resume/14375/1   等内推信息 岗位描述:作为产品的质量守护者,在全面理解被 ...

  4. C. Smallest Word

    链接 [http://codeforces.com/contest/1043/problem/C] 题意 给你一个只包含a,b的字符串,有一种操作把第1个字符到第i个字符的子串进行反转,问要使最后字符 ...

  5. think in UML(一)

    从一开始上课老师就讲面向对象设计面向对象设计,然而对于什么是面向对象是什么没有什么具体的概念,相较于面向对象设计,面向对象又有什么什么优势.<大象>从一开始就交代了我最基础的知识欠缺,在书 ...

  6. Hadoop 5 Hbase 遇到的问题

    hbase伪分布式配置完成后: 在bin/hbase shell 进行create操作时出现:Can't get master address from ZooKeeper; znode data = ...

  7. Week1个人作业

    关于教材的疑问 阅读的教材<构建之法> 1第一章中提到:“软件企业=软件+商业模式”,这样的结构是否过于简单,尤其是在互联网+时代 2.在进行单元测试的时候,怎么做到100%覆盖 3.个人 ...

  8. vue组件间的数据和方法传递

    方法 1.父组件调用子组件:ref(在子组件中加上ref即可通过this.$refs.ref.method调用) 2.子组件调用父组件:emit(this.$emit(调用的方法名,传递的参数)) 数 ...

  9. laravel 处理自定错误页面,如404,500,501,502,503,504等等

    laravel 5.0 版本下,修改pp/Exceptions/Handler.phppublic function render($request, Exception $e) { if ($e i ...

  10. 如何让搜索引擎抓取AJAX内容?

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...