链接w:http://www.lydsy.com/JudgeOnline/problem.php?id=3489

题解:http://blog.csdn.net/PoPoQQQ/article/details/42104273

QwQ树套树好容易T啊,于是在磊少的带领下爽卡一波常数~

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <iostream>
  4 #include <algorithm>
  5 #define MaxN 100010
  6 #define MaxM 40000010
  7 using namespace std;
  8 int S = 0, n, m, N, tot = 0, ret = 0;
  9 int pre[MaxN], suf[MaxN], root[MaxN];
 10 int ls[MaxM], rs[MaxM], Max[MaxM];
 11 struct tree{
 12     int ls, rs, root;
 13 }tr[MaxN*20];
 14 struct rec{
 15     int pre, suf, v, id;
 16 }num[MaxN];
 17 namespace IStream {
 18     const int L = 1 << 15;
 19     char buffer[L], *S, *T;
 20     inline char Get_Char() {
 21         if(S == T) {
 22             T = (S = buffer) + fread(buffer, 1, L, stdin);
 23             if(S == T) return EOF;
 24         }
 25         return *S++;
 26     }
 27     inline int Get_Int() {
 28         char c;
 29         int re = 0;
 30         for(c = Get_Char(); c < '0' || c > '9'; c = Get_Char());
 31         while(c >= '0' && c <= '9')
 32             re = (re << 1) + (re << 3) + (c - '0'), c = Get_Char();
 33         return re;
 34     }
 35 }
 36
 37 bool cmp(rec a, rec b){
 38     return a.pre < b.pre;
 39 }
 40
 41 inline void updata(int &x, int l, int r, int k, int v){
 42     int fa = x; x = ++tot;
 43     ls[x] = ls[fa], rs[x] = rs[fa];
 44     Max[x] = max(Max[fa], v);
 45     if (l == r) return;
 46     int mid = (l+r)>>1;
 47     if (k <= mid) updata(ls[x], l, mid, k, v);
 48     else updata(rs[x], mid+1, r, k, v);
 49 }
 50
 51 inline void updata(int &x, int l, int r, int pos, int k, int v){
 52     int fa = x; x = ++S;
 53     tr[x] = tr[fa];
 54     updata(tr[x].root, 1, n, k, v);
 55     if (l == r) return;
 56     int mid = (l+r)>>1;
 57     if (pos <= mid) updata(tr[x].ls, l, mid, pos, k, v);
 58     else updata(tr[x].rs, mid+1, r, pos, k, v);
 59 }
 60
 61 inline void query(int x, int l, int r, int a, int b){
 62     if (!x) return;
 63     if (a <= l && b >= r) {
 64         ret = max(ret, Max[x]);
 65         return ;
 66     }
 67     int mid = (l+r)>>1;
 68     if (a <= mid) query(ls[x], l, mid, a, b);
 69     if (b > mid) query(rs[x], mid+1, r, a, b);
 70 }
 71
 72 inline void query(int x, int l, int r, int a, int b, int L, int R){
 73     if (a <= l && b >= r) {
 74         query(tr[x].root, 1, n, L, R);
 75         return;
 76     }
 77     int mid = (l+r)>>1;
 78     if (a <= mid) query(tr[x].ls, l, mid, a, b, L, R);
 79     if (b > mid) query(tr[x].rs, mid+1, r, a, b, L, R);
 80 }
 81
 82 inline void Read_Data(){
 83     n = IStream::Get_Int(); m = IStream::Get_Int(); N = n+1;
 84     for (int i = 1; i <= n; i++) num[i].v = IStream::Get_Int(), pre[i] = 0, suf[i] = n+1, num[i].id = i;
 85     for (int i = 1; i <= n; i++) num[i].pre = pre[num[i].v], pre[num[i].v] = i;
 86     for (int i = n; i > 0; i--) num[i].suf = suf[num[i].v], suf[num[i].v] = i;
 87     sort(num+1, num+1+n, cmp);
 88     for (int i = 0, j = 1; i < n; i++){
 89         if (i) root[i] = root[i-1];
 90         while(j <= n && num[j].pre == i){
 91             updata(root[i], 0, N, num[j].suf, num[j].id, num[j].v);
 92             j++;
 93         }
 94     }
 95 }
 96
 97 inline void Solve(){
 98     int l, r, ans = 0;
 99     for (int i = 1; i <= m; i++){
100         l = IStream::Get_Int(); r = IStream::Get_Int();
101         l = (l+ans)%n+1; r = (r+ans)%n+1;
102         if (l > r) swap(l, r);
103         query(root[l-1], 0, N, r+1, N, l, r);
104         ans = ret; ret = 0;
105         printf("%d\n", ans);
106     }
107 }
108
109 int main(){
110     freopen("bzoj3489.in", "r", stdin);
111     freopen("bzoj3489.out", "w", stdout);
112     Read_Data();
113     Solve();
114     return 0;
115 }

转载于:https://www.cnblogs.com/Lukaluka/p/5274760.html

【BZOJ3489】A simple rmq problem(树套树)相关推荐

  1. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  2. [bzoj3489]A simple rmq problem

    https://www.zybuluo.com/ysner/note/1298153 题面 给出一个长度为\(n\)的序列,给出\(M\)个询问: 在\([l,r]\)之间找到一个在这个区间里只出现过 ...

  3. bzoj 3489 A simple rmq problem——主席树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...

  4. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  5. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MB Submit: 1594  Solved: 520 [Submi ...

  6. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  7. P2617-Dynamic Rankings【树套树】

    正题 题目链接:https://www.luogu.com.cn/problem/P2617 题目大意 给出一个序列,要求支持 区间查询第kkk大 单点修改 解题思路 区间查询第kkk大需要使用主席树 ...

  8. P3332-[ZJOI2013]K大数查询【树套树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3332 题目大意 开始nnn个可以重复的集合,要求支持操作 1lrc:1\ l\ r\ c:1 l r c:将cc ...

  9. BZOJ 3262 cdq分治 OR 树套树

    注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...

最新文章

  1. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp
  2. Hibernate实现对多个表进行关联查询
  3. 用 Java 实现断点续传 (HTTP)
  4. Part2_3 正则表达式、Excel表格相关操作
  5. linux设备模型之Class
  6. 结合源码分析 bubble 使用注意事项
  7. pytorch 吸烟检测yolov5s
  8. 华为新系统鸿蒙能互通吗,「连接」万物的鸿蒙,能拯救华为手机吗?
  9. python运维开发_Python自动化运维开发----基础(一)
  10. DW —— 静态图片的交替更换
  11. Linux内核的温度阀值,Linux内核参数.doc
  12. 数组最大子数组和(续)之动态规划
  13. 黑色精美大气DJ音乐歌曲网站源码+带WAP手机端
  14. mysql数据恢复(根据.ibd文件恢复数据)
  15. Steam忘记账号如何在文件夹中找回
  16. 计算机公式大小写,Excel表格金额大小写转换公式设置
  17. 腾讯下载QLV文件装换MP4
  18. 洛谷——P1617 爱与愁的一千个伤心的理由
  19. C++入门——实现见缝插针游戏
  20. Go (Golang) 工具之自动化版本工具 gsemver | semver 语义化版本规范

热门文章

  1. SpringBoot工程不注册到Eureka上
  2. Java计算两个经纬度间的距离
  3. c++ primer5 第一章书籍上的一些代码
  4. Spark学习之spark集群搭建
  5. Nginx负载均衡配置+keepalived高可用
  6. 乐观锁、悲观锁,这一篇就够了!
  7. 第六章:如何在SpringBoot项目中使用拦截器
  8. Elasticsearch的Watcher插件
  9. 删除IE 下输入后的清除小叉叉
  10. asterisk远程注册