【BZOJ3489】A simple rmq problem(树套树)
链接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(树套树)相关推荐
- BZOJ3489 A simple rmq problem 【可持久化树套树】*
BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...
- [bzoj3489]A simple rmq problem
https://www.zybuluo.com/ysner/note/1298153 题面 给出一个长度为\(n\)的序列,给出\(M\)个询问: 在\([l,r]\)之间找到一个在这个区间里只出现过 ...
- bzoj 3489 A simple rmq problem——主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- 【BZOJ3489】A simple rmq problem kd-tree
[BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MB Submit: 1594 Solved: 520 [Submi ...
- 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 ...
- P2617-Dynamic Rankings【树套树】
正题 题目链接:https://www.luogu.com.cn/problem/P2617 题目大意 给出一个序列,要求支持 区间查询第kkk大 单点修改 解题思路 区间查询第kkk大需要使用主席树 ...
- P3332-[ZJOI2013]K大数查询【树套树】
正题 题目链接:https://www.luogu.com.cn/problem/P3332 题目大意 开始nnn个可以重复的集合,要求支持操作 1lrc:1\ l\ r\ c:1 l r c:将cc ...
- BZOJ 3262 cdq分治 OR 树套树
注意判断 三个条件都一样的-- (CDQ分治 其实并不是很难理解 只是想不到--) CDQ分治: //By SiriusRen #include <cstdio> #include < ...
最新文章
- linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp
- Hibernate实现对多个表进行关联查询
- 用 Java 实现断点续传 (HTTP)
- Part2_3 正则表达式、Excel表格相关操作
- linux设备模型之Class
- 结合源码分析 bubble 使用注意事项
- pytorch 吸烟检测yolov5s
- 华为新系统鸿蒙能互通吗,「连接」万物的鸿蒙,能拯救华为手机吗?
- python运维开发_Python自动化运维开发----基础(一)
- DW —— 静态图片的交替更换
- Linux内核的温度阀值,Linux内核参数.doc
- 数组最大子数组和(续)之动态规划
- 黑色精美大气DJ音乐歌曲网站源码+带WAP手机端
- mysql数据恢复(根据.ibd文件恢复数据)
- Steam忘记账号如何在文件夹中找回
- 计算机公式大小写,Excel表格金额大小写转换公式设置
- 腾讯下载QLV文件装换MP4
- 洛谷——P1617 爱与愁的一千个伤心的理由
- C++入门——实现见缝插针游戏
- Go (Golang) 工具之自动化版本工具 gsemver | semver 语义化版本规范