题面

Vjudge

Sol

给一个数列,有m个询问,每次问数列[l,r]区间中所有数的第一次出现的位置的中位数是多少,强制在线

主席树

询问区间内不同的数的个数

树上二分找到那个中位数

  1. # include <bits/stdc++.h>
  2. # define RG register
  3. # define IL inline
  4. # define Fill(a, b) memset(a, b, sizeof(a))
  5. using namespace std;
  6. typedef long long ll;
  7. const int _(2e5 + 5);
  8. const int __(8e6);
  9. IL int Input(){
  10. RG int x = 0, z = 1; RG char c = getchar();
  11. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  12. for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  13. return x * z;
  14. }
  15. int n, m, rt[_], tot, o[_], len, a[_], vis[_];
  16. struct HJT{
  17. int ls, rs, sz;
  18. } T[__];
  19. IL void Modify(RG int &x, RG int l, RG int r, RG int p, RG int v){
  20. T[++tot] = T[x], T[x = tot].sz += v;
  21. if(l == r) return;
  22. RG int mid = (l + r) >> 1;
  23. if(p <= mid) Modify(T[x].ls, l, mid, p, v);
  24. else Modify(T[x].rs, mid + 1, r, p, v);
  25. }
  26. IL int Query(RG int x, RG int l, RG int r, RG int L, RG int R){
  27. if(!x) return 0;
  28. if(L <= l && R >= r) return T[x].sz;
  29. RG int mid = (l + r) >> 1, ret = 0;
  30. if(L <= mid) ret = Query(T[x].ls, l, mid, L, R);
  31. if(R > mid) ret += Query(T[x].rs, mid + 1, r, L, R);
  32. return ret;
  33. }
  34. IL int Calc(RG int x, RG int l, RG int r, RG int k){
  35. if(l == r) return l;
  36. RG int mid = (l + r) >> 1, s = T[T[x].ls].sz;
  37. if(k <= s) return Calc(T[x].ls, l, mid, k);
  38. return Calc(T[x].rs, mid + 1, r, k - s);
  39. }
  40. int main(RG int argc, RG char* argv[]){
  41. for(RG int t = Input(), Case = 1; Case <= t; ++Case){
  42. Fill(T, 0), Fill(rt, 0), Fill(vis, 0), tot = 0;
  43. n = Input(), m = Input();
  44. for(RG int i = 1; i <= n; ++i) o[i] = a[i] = Input();
  45. sort(o + 1, o + n + 1), len = unique(o + 1, o + n + 1) - o - 1;
  46. for(RG int i = n; i; --i){
  47. a[i] = lower_bound(o + 1, o + len + 1, a[i]) - o;
  48. rt[i] = rt[i + 1];
  49. if(!vis[a[i]]) vis[a[i]] = i, Modify(rt[i], 1, n, i, 1);
  50. else{
  51. Modify(rt[i], 1, n, vis[a[i]], -1);
  52. vis[a[i]] = i;
  53. Modify(rt[i], 1, n, i, 1);
  54. }
  55. }
  56. printf("Case #%d:", Case);
  57. for(RG int i = 1, ans = 0; i <= m; ++i){
  58. RG int l = Input(), r = Input(), ql, qr, num;
  59. ql = min((l + ans) % n + 1, (r + ans) % n + 1);
  60. qr = max((l + ans) % n + 1, (r + ans) % n + 1);
  61. num = Query(rt[ql], 1, n, ql, qr);
  62. printf(" %d", ans = Calc(rt[ql], 1, n, (num + 1) >> 1));
  63. }
  64. puts("");
  65. }
  66. return 0;
  67. }

HDU5919:Sequence II的更多相关文章

  1. [HDU5919]Sequence II

    [HDU5919]Sequence II 试题描述 Mr. Frog has an integer sequence of length n, which can be denoted as a1,a ...

  2. HDU 5919 Sequence II 主席树

    Sequence II Problem Description   Mr. Frog has an integer sequence of length n, which can be denoted ...

  3. HDU 5919 Sequence II(主席树+逆序思想)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  4. HDOJ 5147 Sequence II 树阵

    树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    ...

  5. hdu 5147 Sequence II 树状数组

    Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  6. hdu 5147 Sequence II (树状数组 求逆序数)

    题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  8. bestcoder#23 1002 Sequence II 树状数组+DP

    Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. LeetCode:课程表II【210】

    LeetCode:课程表II[210] 题目描述 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一 ...

随机推荐

  1. [Python Study Notes]cpu信息

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  2. Hive metastore源码阅读(三)

    上次写了hive metastore的partition的生命周期,但是简略概括了下alter_partition的操作,这里补一下alter_partition,因为随着项目的深入,发现它涉及的地方 ...

  3. 置换群、Burnside引理与等价类计数问题

    置换群.Burnside引理与等价类计数问题 标签: 置换群 Burnside引理 置换 说说我对置换的理解,其实就是把一个排列变成另外一个排列.简单来说就是一一映射.而置换群就是置换的集合. 比如\ ...

  4. ucore文件系统详解

    最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...

  5. yii2 查询构建器

    Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...

  6. MysqL应该考虑到的安全策略

    1:使用预处理语句防止SQL注入2:写入数据库的数据要进行特殊字符的转义,比如字符中带单引号和双引号需要在应用层转义,这样为了防止SQL注入3:查询的错误信息不要返回给用户,将错误记录到日志.错误信息 ...

  7. JDBC数据库操作

    JDBC:   创建SQL语句对象    Statement statement = (Statement) con.createStatement() ;   调用执行     statement. ...

  8. CodeForces-747E

    这几天好懒,昨天写的题,今天才来写博客.... 这题你不知道它究竟有多少层,但是知道字符串长度不超过10^6,那么它的总容量是被限定的,用一个二维动态数组就OK了.输入字符串后,可以把它按照逗号分割成 ...

  9. svn版本管理系统出现的问题解决办法

    首先会出现下面的一个提示错误: cannot checkout from svn run 'cleanup' if it was interrupted 百度加谷歌找到的解决问题的办法各种各样,自己遇 ...

  10. shell脚本基础 循环机构

    循环结构 for循环格式一格式:for 变量 in 值1 值2 ........(值不一定是数字,可以是命令或者其他的)do 命令done [root@ceshiji ~]# vim a.sh #!/ ...