题意

题目链接

Sol

(真后悔没打这场EDU qwq)

首先把询问离线,预处理每个数的\(pre, nxt\),同时线段树维护\(pre\)(下标是\(pre\),值是\(i\)),同时维护一下最大值

那么每次在\((1, l - 1)\)内查询最大值,如果最大值\(>= l\),那么说明合法

但是\(pre\)可能会有相同的情况(0),直接开个set维护一下

然后用vector对\(nxt\)维护一个类似差分的东西,在\(nxt_i\)的位置删除掉\(i\)的影响

  1. // luogu-judger-enable-o2
  2. /*
  3. */
  4. #include<bits/stdc++.h>
  5. #define LL long long
  6. #define Pair pair<int, int>
  7. #define MP(x, y) make_pair(x, y)
  8. #define fi first
  9. #define se second
  10. using namespace std;
  11. const int MAXN = 2e6 + 10;
  12. template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
  13. template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
  14. inline int read() {
  15. char c = getchar(); int x = 0, f = 1;
  16. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  17. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  18. return x * f;
  19. }
  20. int N, M, a[MAXN], pre[MAXN], nxt[MAXN], ans[MAXN], date[MAXN], num = 0;
  21. vector<Pair> q[MAXN];
  22. void Des() {
  23. for(int i = 1; i <= N; i++) date[i] = a[i];
  24. sort(date + 1, date + N + 1);
  25. num = unique(date + 1, date + N + 1) - date - 1;
  26. for(int i = 1; i <= N; i++) a[i] = lower_bound(date + 1, date + num + 1, a[i]) - date;
  27. }
  28. void Get() {
  29. static int las[MAXN];
  30. for(int i = 1; i <= N; i++) pre[i] = las[a[i]], las[a[i]] = i;
  31. for(int i = 1; i <= N; i++) las[i] = N + 1;
  32. for(int i = N; i >= 1; i--) nxt[i] = las[a[i]], las[a[i]] = i;
  33. }
  34. #define Getmid ((T[k].l + T[k].r) >> 1)
  35. #define ls k << 1
  36. #define rs k << 1 | 1
  37. struct Node {
  38. int l, r, mx;
  39. }T[MAXN];
  40. void update(int k) {
  41. T[k].mx = max(T[ls].mx, T[rs].mx);
  42. }
  43. void Build(int k, int ll, int rr) {
  44. T[k].l = ll; T[k].r = rr; T[k].mx = 0;
  45. if(ll == rr) return ;
  46. int mid = Getmid;
  47. Build(ls, ll, mid); Build(rs, mid + 1, rr);
  48. }
  49. void Modify(int k, int pos, int v) {
  50. if(T[k].l == T[k].r) {T[k].mx = v; return ;}
  51. int mid = Getmid;
  52. if(pos <= mid) Modify(ls, pos, v);
  53. if(pos > mid) Modify(rs, pos, v);
  54. update(k);
  55. }
  56. int Query(int k, int ll, int rr) {
  57. if(ll <= T[k].l && T[k].r <= rr) return T[k].mx;
  58. int mid = Getmid, ans = 0;
  59. if(ll <= mid) chmax(ans, Query(ls, ll, rr));
  60. if(rr > mid) chmax(ans, Query(rs, ll, rr));
  61. return ans;
  62. }
  63. #undef ls
  64. #undef rs
  65. #undef Getmid
  66. void Solve() {
  67. set<int> s;
  68. static vector<int> v[MAXN];
  69. for(int i = 1; i <= N; i++) {
  70. for(int j = 0; j < v[i].size(); j++) {
  71. if(!pre[v[i][j]])
  72. s.erase(v[i][j]);
  73. else Modify(1, pre[v[i][j]], 0);
  74. }
  75. if(!pre[i])
  76. s.insert(i);
  77. else Modify(1, pre[i], i);
  78. v[nxt[i]].push_back(i);
  79. for(int j = 0; j < q[i].size(); j++) {
  80. int t = Query(1, 1, q[i][j].fi - 1);
  81. if(t >= q[i][j].fi) ans[q[i][j].se] = date[a[t]];
  82. if(!s.empty()) {
  83. set<int>::iterator it = s.end(); it--;
  84. if(*it >= q[i][j].fi) ans[q[i][j].se] = date[a[*it]];
  85. }
  86. }
  87. }
  88. }
  89. signed main() {
  90. N = read();
  91. for(int i = 1; i <= N; i++) a[i] = read();
  92. Des();
  93. Get();
  94. Build(1, 1, N + 1);
  95. M = read();
  96. for(int i = 1; i <= M; i++) {
  97. int l = read(), r = read();
  98. q[r].push_back(MP(l, i));
  99. }
  100. Solve();
  101. for(int i = 1; i <= M; i++) printf("%d\n", ans[i]);
  102. return 0;
  103. }
  104. /*
  105. 5
  106. 1 2 2 1 1
  107. 2
  108. 1 5
  109. 2 3
  110. 10
  111. 5 9 6 4 8 7 4 9 7 6
  112. 1
  113. 4 8
  114. */

cf1000F. One Occurrence(线段树 set)的更多相关文章

  1. cf1000F One Occurrence (线段树)

    这题我是离线做的 设i位置的数上次出现的位置是pre[i](如果第一次出现那就是0) 可以想到,用线段树维护一个区间的pre的最小值,如果它小于区间左端点,那这个数就是一个合法的答案 但直接这样做是错 ...

  2. HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并)

    layout: post title: HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并) author: "luowentaoaa&quo ...

  3. Sum of Squares of the Occurrence Counts解题报告(后缀自动机+LinkCutTree+线段树思想)

    题目描述 给定字符串\(S(|S|\le10^5)\),对其每个前缀求出如下的统计量: 对该字符串中的所有子串,统计其出现的次数,求其平方和. Sample Input: aaa Sample Out ...

  4. F - One Occurrence CodeForces - 1000F (线段树+离线处理)

    You are given an array aa consisting of nn integers, and qq queries to it. ii-th query is denoted by ...

  5. HDU - 6704 K-th occurrence (后缀数组+主席树/后缀自动机+线段树合并+倍增)

    题意:给你一个长度为n的字符串和m组询问,每组询问给出l,r,k,求s[l,r]的第k次出现的左端点. 解法一: 求出后缀数组,按照排名建主席树,对于每组询问二分或倍增找出主席树上所对应的的左右端点, ...

  6. K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)

    大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...

  7. hdu6704 2019CCPC网络选拔赛1003 K-th occurrence 后缀自动机+线段树合并

    解题思路: fail树上用权值线段树合并求right/endpos集合,再用倍增找到待查询串对应节点,然后权值线段树求第k大. #include<bits/stdc++.h> using ...

  8. hdu 6704 K-th occurrence(后缀数组+可持久化线段树)

    Problem Description You are given a string S consisting of only lowercase english letters and some q ...

  9. hdu 4117 -- GRE Words (AC自动机+线段树)

    题目链接 problem Recently George is preparing for the Graduate Record Examinations (GRE for short). Obvi ...

随机推荐

  1. 查看服务器CPU的个数、CPU的核数、多核超线程数、机器硬件型号

    这里有几个概念: 1.一台物理机的物理CPU的个数 2.一个CPU上的核数 3.一个核上面支持的线程数 有下面的计算公式: # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 ...

  2. Web应用配置虚拟主机(www.baidu.com)

    最终效果:浏览器地址栏输入www.baidu.com访问时,会显示自己的网页 1.创建文件 任意盘新建一个www.baidu.com文件,在该文件夹下新建WEB-INF文件.自己写的一个html文件, ...

  3. SQL实现数据行列转换

    前言: 在日常的工作中,使用数据库查看数据是很经常的事,数据库的数据非常多,如果此时的数据设计是一行行的设计话,就会有多行同一个用户的数据,查看起来比较费劲,如果数据较多时,不方便查看,为了更加方便工 ...

  4. POJ 1047

    #include <iostream> #define MAXN 100 using namespace std; char _m[MAXN]; int ans[MAXN]; int ma ...

  5. Vim实用技巧系列 - 代码注释

    在写代码时候,有时候需要临时注释掉一部分代码,之后还要取消这些注释.真麻烦.那么,用Vim怎么做这件事呢? 第一种方法,块模式.                 再次声明,本系列全部以windows下 ...

  6. rails中 flash 和 flash.now的区别

    Flash[:notice]’s message will persist to the next action and should be used when redirecting to anot ...

  7. 页面滚动插件 better-scroll 的用法

    better-scroll 是一个页面滚动插件,用它可以很方便的实现下拉刷新,锚点滚动等功能. 实现原理:父容器固定高度,并设置 overflow:hidden,子元素超出父元素高度后将被隐藏,超出部 ...

  8. Linux 命令学习之rm

    功能说明: rm 命令是对文件或目录进行删除操作. 语法:rm [-dfirv][--help][--version][文件或目录...] 补充说明:执行rm指令可删除文件或目录,如欲删除目录必须加上 ...

  9. Install Tomcat 6 on CentOS or RHEL --转载

    source:http://www.davidghedini.com/pg/entry/install_tomcat_6_on_centos This post will cover installa ...

  10. Beta阶段——Scrum 冲刺博客第五天

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 完成部分answer界面的制作,将题目与用户输入的答案.正确答案依次列出来 ...