题目

\(kdt\)就是数点神器

我们先扫两遍处理出每个数上一次出现的位置\(pre_i,nxt_i\),之后变成\((i,pre_i,nxt_i)\)这样一个三维空间上的点

就变成了求一个立方体的最大值了

随便剪剪枝就过了

代码

#include<bits/stdc++.h>
#define re register
#define max(a,b) ((a)>(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=100005;
struct Point{int v,x[3];}p[maxn];
int a[maxn],pre[maxn],nxt[maxn],st[maxn];
int n,m,op,L[3],R[3],cnt,lst;
int mn[maxn][3],mx[maxn][3],pos[maxn],l[maxn],r[maxn],d[maxn];
inline int cmp(const Point &A,const Point &B) {return A.x[op]<B.x[op];}
inline void pushup(int k) {
mx[k][0]=mn[k][0]=p[pos[k]].x[0];
mx[k][1]=mn[k][1]=p[pos[k]].x[1];
mx[k][2]=mn[k][2]=p[pos[k]].x[2];
d[k]=max(d[l[k]],d[r[k]]);d[k]=max(d[k],p[pos[k]].v);
for(re int i=0;i<3;i++) {
if(mx[l[k]][i]>mx[k][i]) mx[k][i]=mx[l[k]][i];
if(mx[r[k]][i]>mx[k][i]) mx[k][i]=mx[r[k]][i];
if(l[k]&&mn[l[k]][i]<mn[k][i]) mn[k][i]=mn[l[k]][i];
if(r[k]&&mn[r[k]][i]<mn[k][i]) mn[k][i]=mn[r[k]][i];
}
}
int build(int x,int y,int o) {
if(x>y) return 0;
int mid=x+y>>1,k=++cnt;
op=o%3;std::nth_element(p+x,p+mid,p+y+1,cmp);
l[k]=build(x,mid-1,o+1),r[k]=build(mid+1,y,o+1);
pos[k]=mid;pushup(k);return k;
}
inline int chk(int k) {
return p[k].x[0]>=L[0]&&p[k].x[0]<=R[0]&&p[k].x[1]>=L[1]&&p[k].x[1]<=R[1]&&p[k].x[2]>=L[2]&&p[k].x[2]<=R[2];
}
inline int out(int k) {
return R[0]<mn[k][0]||L[0]>mx[k][0]||R[1]<mn[k][1]||L[1]>mx[k][1]||R[2]<mn[k][2]||L[2]>mx[k][2];
}
inline int in(int k) {
return L[0]<=mn[k][0]&&R[0]>=mx[k][0]&&L[1]<=mn[k][1]&&R[1]>=mx[k][1]&&L[2]<=mn[k][2]&&R[2]>=mx[k][2];
}
void query(int k) {
if(in(k)) {lst=max(lst,d[k]);return;}
if(chk(pos[k])) lst=max(lst,p[pos[k]].v);
if(l[k]&&!out(l[k])&&lst<d[l[k]]) query(l[k]);
if(r[k]&&!out(r[k])&&lst<d[r[k]]) query(r[k]);
}
int main() {
n=read(),m=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++)
pre[i]=st[a[i]],st[a[i]]=i;
for(re int i=1;i<=n;i++) st[i]=n+1;
for(re int i=n;i;--i)
nxt[i]=st[a[i]],st[a[i]]=i;
for(re int i=1;i<=n;i++)
p[i].x[0]=i,p[i].x[1]=pre[i],p[i].x[2]=nxt[i],p[i].v=a[i];
build(1,n,0);int x,y;
L[1]=0,R[2]=n+1;
while(m--) {
x=read()+lst,y=read()+lst;
x%=n,y%=n,++x,++y;
if(x>y) std::swap(x,y);
L[0]=x,R[0]=y;R[1]=x-1,L[2]=y+1;
lst=0;query(1);printf("%d\n",lst);
}
return 0;
}

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

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

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

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

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

  3. 【BZOJ3489】A simple rmq problem

    [BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...

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

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

  5. 【bzoj3489】 A simple rmq problem

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

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

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

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

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

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

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

  9. 【BZOJ 3218】 3218: a + b Problem(最小割+可持久化线段树)

    3218: a + b Problem Time Limit: 20 Sec  Memory Limit: 40 MBSubmit: 1440  Solved: 545 Description Inp ...

随机推荐

  1. Jmeter-【JSON Extractor】-响应结果中二级key取值

    一.请求返回样式 二.取chapter的值 三.查看结果

  2. php 使用fseek指针读取大文件日志

    function text($fp,$n,$b=5) { if($n>0){ $p = $n+1; $lines = array(); while(count($lines)< =$n){ ...

  3. WebStorm+Node.js开发环境的配置

    1 下载地址:  webstorm:http://www.jetbrains.com/webstorm node.js:https://nodejs.org/download/ 2 安装node.js ...

  4. mdk keil 指定变量、函数存储位置,使用 Scatter-Loading Description File, __attribute__(("section“))

    0. 数据类型说明 主要包括4类: Code (inc. data) ,属于RO,也就是写的函数代码(包括代码中的变量) RO Data , 属于RO,使用const修饰的变量. RW Data, 属 ...

  5. 剑指offer——09青蛙跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果).   题解: 说俗一点,就是找规律: 不不,首先,我们分析一下,青蛙第一 ...

  6. 引入css文件时,css link和@import区别

    这里link与@import介绍的是html引入css的语法单词.两者均是引入css到html的单词. 一.了解基本 1.link语法结构 <link href="CSSurl路径&q ...

  7. 2018湘潭大学程序设计竞赛【B】

    题目链接: https://www.nowcoder.com/acm/contest/105/B 题意: 给你一个字母矩阵,和测试组数,让你统计字符串的字符累计出现的次数,然后让你找出需要找的字符,这 ...

  8. hashmap1.7的死锁模拟

    package com.cxy.springdataredis.hashmap; import javax.lang.model.element.VariableElement; import jav ...

  9. iOS组件化开发-CocoaPods简介

    CocoaPods简介 任何一门开发语言到达一定阶段就会出现第三方的类库管理工具,比如Java的Maven.WEB的Webpack等.在iOS中类库的管理工具-CocoaPods. 利用CocoaPo ...

  10. 《软件调试修炼之道》Part 1(CH1~5)读书笔记 PB16110698 第八周(~4.26)

    编程中,调试几乎是必不可少的,一劳永逸.一次完成预想功能而完全不出bug的情况凤毛麟角,出现bug→调试→再出现bug→再调试……基本是软件工程中的常态.可以说,软件调试是每个coder的必修课,而& ...