【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. iOS UI(绘图)的几张原理图

    Core Animation是对OpenGL ES的Objective-C封装,具有与OpenGL ES几乎等价的高性能,却隐藏了OpenGL ES的复杂性. https://www.cnblogs. ...

  2. UVa 1515 - Pool construction(最小割)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 多GPU计算

    多GPU计算已经可以说,只要是个成熟的模型,都使用了这一点. 例如: gluoncv:https://github.com/dmlc/gluon-cv/blob/master/scripts/dete ...

  4. 【[NOI2010]超级钢琴】

    我竟然又在写主席树 现在可是九月啦,我却还在写这种noip不可能考的算法 我觉得我真的要凉 题意很明确,就是给你一个序列,让从中选择\(k\)段连续的序列,长度必须大于等于\(L\)小于等于\(R\) ...

  5. ZooKeeper学习之路 (七)ZooKeeper设计特点及典型应用场景

    ZooKeeper 特点/设计目的 ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的 各服务节点进行数据的复制和同步. 数据复制的好处 1.容错:一个节点出错 ...

  6. 【php】获取ip

    addBoard.php中获取到ip $ip=$_SERVER['REMOTE_ADDR']; 通过ajax采取POST方式发送到服务器 $("#submit").on(" ...

  7. 4、Spring Cloud-负载均衡 Ribbon

    4.1.RestTemplate 简介 RestTemplate是Spring Resources中一个访问RESTful API 接口的网络请求框架.   RestTemplate 的设计 则和其他 ...

  8. parse.JSON()报错是什么原因?

    哪里出错了? JSON.parse() 会把一个字符串解析成 JSON 对象.如果字符串书写正确,那么其将会被解析成一个有效的 JSON,但是这个字符串被检测出错误语法的时候将会抛出错误. 示例 JS ...

  9. Linux中使用iptables开放特定端口

    禁止其他主机对该特定主机进行访问和远程连接控制,所以只开放特定端口 只控制INPUT链就可达到控制其他主机对该主机的访问. 1.首先关闭INPUT链 iptables -P INPUT DROP 使用 ...

  10. 【问题解决】增加https后 phpcms 分页错误

    https://m.cnbuses.com/m.cnbuses.com/index.php?page=2查看分页方法 function pages()中有个pageurl 查看该方法,发现有类似htt ...