【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. sed.md

    SED sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用s ...

  2. 寄存器简介 与 ebp esp

    http://www.cnblogs.com/zhuyuanhao/archive/2012/10/16/3262870.html 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX ...

  3. vue2.* 双向数据绑定 Vue事件介绍 以及Vue中的ref获取dom节点 04

    <template> <div id="app"> <!-- 双向数据绑定(必须在表单里面使用) m:model v:view mvvm:model改 ...

  4. Vue实现购物小球抛物线

    .shop{ position: fixed; top: 300px; left: 40px; } .ball{ position: fixed; left: 32px; bottom: 22px; ...

  5. [Python 多线程] GIL全局解释器锁 (十三)

    Queue 标准库queue模块,提供FIFO(先进先出)的Queue.LIFO(后进先出)的队列.优先队列. Queue类是线程安全的,适用于多线程间安全的交换数据.内部使用了Lock和Condit ...

  6. 使用navigator.userAgent来进行浏览器嗅探

    /*--------------------------------------------------------------------------------* * 功能描述:使用navigat ...

  7. PAT——1072. 开学寄语(20)

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...

  8. 字符型设备驱动程序-first-printf以及点亮LED灯(二)

    编译这几个函数之前要学一下:Linux 的几个操作命令. 学习地址:http://edu.51cto.com/lesson/id-101824.html 重要的命令 有4个 :分别是 1.lsmod, ...

  9. SpringMVC转发页面405错误

    需要在该方法前加上:@ResponseBody注解 加上这个注解后可能在转发页面的时候出现问题,则需要在方法的参数中增加HttpServletRequest 和HttpServletResponse参 ...

  10. MySQL——安装

    1. 下载源: http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql80-community-release-el7-2.no ...