【BZOJ3489】A simple rmq problem

题面

bzoj

题解

这个题不强制在线的话随便做啊。。。

考虑强制在线时怎么搞

预处理出一个位置上一个出现的相同数的位置\(pre\)与下一个位置\(nxt\)

则对于一个询问\([l,r]\)

一个位置\(i\)当且仅当\(pre_i<l\)且\(nxt_i>r\)

我们可以将一个位置看作一个点坐标为\((pre_i,nxt_i)\)

要求横坐标\(<l\)且纵坐标\(>r\)

这个可以用简单\(kdTree\)

也可以用一个可持久化树套树强行维护一下

因为我写的时候还不会\(KDT\),所以用可持久化树套树强行维护了一波

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 100005;
int N, M;
struct Number { int val, pre, nxt, id; } a[MAX_N];
bool operator < (const Number &l, const Number r) { return l.pre < r.pre; }
struct Prestree { int ls, rs, rt; } t[MAX_N * 22];
struct SGT { int ls, rs, mx; } It[MAX_N * 18 * 18];
int rt[MAX_N], tot, cnt;
void ins(int &o, int p, int l, int r, int pos, int v) {
o = ++tot; It[o] = It[p], It[o].mx = max(It[o].mx, v);
if (l == r) return ;
int mid = (l + r) >> 1;
if (pos <= mid) ins(It[o].ls, It[p].ls, l, mid, pos, v);
else ins(It[o].rs, It[p].rs, mid + 1, r, pos, v);
}
void insert(int &o, int p, int l, int r, Number v) {
o = ++cnt; t[o] = t[p]; ins(t[o].rt, t[p].rt, 1, N, v.id, v.val);
if (l == r) return ;
int mid = (l + r) >> 1;
if (v.nxt <= mid) insert(t[o].ls, t[p].ls, l, mid, v);
else insert(t[o].rs, t[p].rs, mid + 1, r, v);
}
int que(int o, int l, int r, int ql, int qr) {
if (!o) return 0;
if (ql <= l && r <= qr) return It[o].mx;
int mid = (l + r) >> 1;
if (qr <= mid) return que(It[o].ls, l, mid, ql, qr);
else if (ql > mid) return que(It[o].rs, mid + 1, r, ql, qr);
else return max(que(It[o].ls, l, mid, ql, qr), que(It[o].rs, mid + 1, r, ql, qr));
}
int query(int o, int l, int r, int pl, int pr, int ql, int qr) {
if (!o) return 0;
if (pl <= l && r <= pr) return que(t[o].rt, 1, N, ql, qr);
int mid = (l + r) >> 1;
if (pr <= mid) return query(t[o].ls, l, mid, pl, pr, ql, qr);
else if (pl > mid) return query(t[o].rs, mid + 1, r, pl, pr, ql, qr);
else return max(query(t[o].ls, l, mid, pl, pr, ql, qr), query(t[o].rs, mid + 1, r, pl, pr, ql, qr));
}
set<int> s[MAX_N];
int ans = 0;
int main () {
N = gi(), M = gi();
for (int i = 1; i <= N; i++) s[i].insert(1), s[i].insert(N + 2);
for (int i = 1; i <= N; i++) a[i].val = gi(), s[a[i].val].insert(i + 1), a[i].id = i;
for (int i = 1; i <= N; i++) {
set<int> :: iterator ite = s[a[i].val].find(i + 1);
a[i].pre = *--ite, ++ite, a[i].nxt = *++ite;
}
sort(&a[1], &a[N + 1]);
for (int i = 1, j = 1; i <= N + 2; i++) {
rt[i] = rt[i - 1];
while (j <= N && a[j].pre == i) insert(rt[i], rt[i], 1, N + 2, a[j++]);
}
while (M--) {
int l = gi(), r = gi();
l = (l + ans) % N + 1;
r = (r + ans) % N + 1;
if (r < l) swap(l, r);
l++; r++;
printf("%d\n", ans = query(rt[l - 1], 1, N + 2, r + 1, N + 2, l - 1, r - 1));
}
return 0;
}

【BZOJ3489】A simple rmq problem的更多相关文章

  1. 【BZOJ3489】A simple rmq problem(KD-Tree)

    [BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...

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

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

  3. 【bzoj3489】 A simple rmq problem

    http://www.lydsy.com/JudgeOnline/problem.php?id=3489 (题目链接) 题意 在线求区间不重复出现的最大的数. Solution KDtree竟然能够处 ...

  4. 【bzoj3489】 A simple rmq problem k-d树

    由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...

  5. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

  6. 【bzoj3489】A simple rmq problem 三维KD-tree

    题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...

  7. 【BZOJ】【3489】A simple rmq problem

    KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]) ...

  8. 【bzoj 3489】A simple rmq problem

    题目 \(kdt\)就是数点神器 我们先扫两遍处理出每个数上一次出现的位置\(pre_i,nxt_i\),之后变成\((i,pre_i,nxt_i)\)这样一个三维空间上的点 就变成了求一个立方体的最 ...

  9. BZOJ3489:A simple rmq problem

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

随机推荐

  1. Django template for 循环用法

    当列表为空或者非空时执行不同操作: {% for item in list %} ... {% empty %} ... {% endfor %} 使用forloop.counter访问循环的次数,下 ...

  2. 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)

    网络层(network layer)是实现互联网的最重要的一层.正是在网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的Internet.更高层的协议,无论是TCP还是UDP,必须通过网络 ...

  3. 【[HAOI2015]树上染色】

    这道题真是非常神仙 第一眼看到题面肯定能想到状态是\(dp[i][j]\)表示\(i\)这棵子树里染了\(j\)个黑点的最大值 最大值? 什么最大值,之后就会发现这个样子完全没有办法转移 所以我们考虑 ...

  4. 【[国家集训队]Crash的数字表格 / JZPTAB】

    这道题我们要求的是 \[\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\] 总所周知\(lcm\)的性质不如\(gcd\)优雅,但是唯一分解定理告诉我们\(gcd(i,j)\time ...

  5. 【jQuery】结合accordion插件分析写插件的方法及注意事项

    1.jQuery插件的命名方式:jquery.[插件名].js 2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上 3.插件内部this指向的是通过选择器获取的jQuery对 ...

  6. rabbitmq关于guest用户登录失败解决方法

    刚安装完rabbitmq,登录的时候出现了: login  failed问题: 查看rabbitmq的文档,发现在3.3.1以后的版中,处于安全的考虑,guest这个默认的用户只能通过localhos ...

  7. Luogu_2774 方格取数问题

    Luogu_2774 方格取数问题 二分图最小割 第一次做这种题,对于某些强烈暗示性的条件并没有理解到. 也就是每一立刻理解到是这个图是二分图. 为什么? 横纵坐标为奇数的只会和横纵坐标为偶数的相连. ...

  8. 无法加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项

    未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 HRESULT:0x80131040). 有时候我们创建了一个类库,我们 ...

  9. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  10. C#中枚举

    1.枚举是一组命名整形常量,枚举类型使用Enum关键字进行声明的.在C#中枚举是值数据类型,枚举包含自己的值,且不能继承或传递继承.