HYSBZ3489-A simple rmq problem
来源:互联网 发布:学乐器的软件 编辑:程序博客网 时间:2024/05/19 18:00
A simple rmq problem
Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 2049 Solved: 695
[Submit][Status][Discuss]
Description
因为是OJ上的题,就简单点好了。给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大。如果找不到这样的数,则直接输出0。我会采取一些措施强制在线。
Input
第一行为两个整数N,M。M是询问数,N是序列的长度(N<=100000,M<=200000)
第二行为N个整数,描述这个序列{ai},其中所有1<=ai<=N
再下面M行,每行两个整数x,y,
询问区间[l,r]由下列规则产生(OIER都知道是怎样的吧>_<):
l=min((x+lastans)mod n+1,(y+lastans)mod n+1);
r=max((x+lastans)mod n+1,(y+lastans)mod n+1);
Lastans表示上一个询问的答案,一开始lastans为0
Output
一共M行,每行给出每个询问的答案。
Sample Input
10 10
6 4 9 10 9 10 9 4 10 4
3 8
10 1
3 4
9 4
8 1
7 8
2 9
1 1
7 3
9 9
6 4 9 10 9 10 9 4 10 4
3 8
10 1
3 4
9 4
8 1
7 8
2 9
1 1
7 3
9 9
Sample Output
4
10
10
0
0
10
0
4
0
4
10
10
0
0
10
0
4
0
4
HINT
注意出题人为了方便,input的第二行最后多了个空格。
2015.6.24新加数据一组,2016.7.9放至40S,600M,但未重测
Source
by zhzqkkk
解题思路:kd-tree,对于每个位置,为该位置维护三个维度,与该位置同权值的前一个数的位置和后一个数的位置(x,y,z),要找的数是所有满足x>=l&&x<=r,y<l,z>r 的数中最大值
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cctype>#include <map>#include <set>#include <stack>#include <queue>#include <vector>#include <bitset>#include <functional>using namespace std;#define LL long longconst int INF = 0x3f3f3f3f;const int N = 200003;const int demension = 3;//二维struct node{int pos[demension];int ma[demension], mi[demension];int l, r, val, mx;}a[N];int cmpDem;//以第cmpDem维作比较int root, n, q, ans, val[N], vis[N], pre[N], nt[N];int ll, rr;bool cmp(const node &a, const node&b){return a.pos[cmpDem] < b.pos[cmpDem];}void Merge(int k){for (int i = 0; i < demension; i++){if (a[k].l){a[k].ma[i] = max(a[k].ma[i], a[a[k].l].ma[i]);a[k].mi[i] = min(a[k].mi[i], a[a[k].l].mi[i]);}if (a[k].r){a[k].ma[i] = max(a[k].ma[i], a[a[k].r].ma[i]);a[k].mi[i] = min(a[k].mi[i], a[a[k].r].mi[i]);}}if (a[k].l) a[k].mx = max(a[k].mx, a[a[k].l].mx);if (a[k].r) a[k].mx = max(a[k].mx, a[a[k].r].mx);}int build(int l, int r, int k){if (l > r) return 0;int mid = (l + r) / 2;//以第mid个元素为中心排序cmpDem = k;nth_element(a + l, a + mid, a + r + 1, cmp);//左右子树a[mid].l = build(l, mid - 1, (k + 1) % demension);a[mid].r = build(mid + 1, r, (k + 1) % demension);Merge(mid);return mid;}int check(int k){if (a[k].pos[0] >= ll&&a[k].pos[0] <= rr&&a[k].pos[1]<ll&&a[k].pos[2]>rr) return 1;return 0;}int check1(int k){if (a[k].ma[0]<ll || a[k].mi[0]>rr || a[k].mi[1] >= ll || a[k].ma[2] <= rr || ans >= a[k].mx) return 0;return 1;}void query(int k){if (check(k)) ans = max(ans, a[k].val);if (a[k].l&&check1(a[k].l)) query(a[k].l);if (a[k].r&&check1(a[k].r)) query(a[k].r);}int main(){scanf("%d%d", &n, &q);memset(vis, 0, sizeof vis);for (int i = 1; i <= n; i++){scanf("%d", &val[i]);pre[i] = vis[val[i]], vis[val[i]] = i;}for (int i = 1; i <= n; i++) vis[i] = n + 1;for (int i = n; i >= 1; i--) nt[i] = vis[val[i]], vis[val[i]] = i;for (int i = 1; i <= n; i++){a[i].pos[0] = i, a[i].pos[1] = pre[i], a[i].pos[2] = nt[i], a[i].val = a[i].mx = val[i];for (int j = 0; j < demension; j++) a[i].mi[j] = a[i].ma[j] = a[i].pos[j];}root = build(1, n, 0);while (q--){scanf("%d%d", &ll, &rr);ll = (ll + ans) % n + 1;rr = (rr + ans) % n + 1;if (ll > rr) swap(ll, rr);ans = 0;query(root);printf("%d\n", ans);}return 0;}
阅读全文
0 0
- HYSBZ3489-A simple rmq problem
- 【BZOJ3489】A simple rmq problem
- BZOJ3489 A simple rmq problem
- 3489: A simple rmq problem
- bzoj3489: A simple rmq problem
- BZOJ 3489 A simple rmq problem
- [bzoj3489] A simple rmq problem 解题报告
- 【31.94%】【BZOJ 3489】A simple rmq problem
- BZOJ3489: A simple rmq problem kdtree
- bzoj 3489: A simple rmq problem
- BZOJ 3489 A simple rmq problem
- BZOJ 3489: A simple rmq problem 树套树
- BZOJ 3489 A simple rmq problem 可持久化树套树
- 3489: A simple rmq problem K-D tree
- bzoj 3489 A simple rmq problem 可持久化树套树
- bzoj 3489: A simple rmq problem (KD-tree)
- [BZOJ3489]A simple rmq problem(kd-tree)
- [BZOJ]3489 A simple rmq problem 主席树套树
- Scala集合类型详解
- < 笔记 > Java SE
- XIII Open Championship of Y.Kupala Grodno SU Grodno Problem E. Enter the Word Problem 贪心+后缀自动机
- Select和Epoll
- 挑战3.2.1 Subsequence (poj 3061)
- HYSBZ3489-A simple rmq problem
- Java Web 开发后续(四)
- ios-缩小图片大小
- python的continue和pass的区别
- 动态代理-JDK 源码剖析(二):源码剖析
- Angular-使用Angular CLI快速搭建框架
- poj2586 Y2K Accounting Bug
- 关于Access denied for user 'root'@'localhost' (using password:NO)
- 红黑树