KD-Tree(乱搞)


  Orz zyf教给蒟蒻做法

  蒟蒻并不会这题正解……(可持久化树套树?。。。Orz

  对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足$ ( pre[i]<ql \ and \ nex[i]>qr\ and\ i \in [ql,qr] ) $

  然后我们以(i,pre[i],nex[i])为坐标……将所有点抽象到三维空间中,每次查询就相当于是一次区域求最值!

这题我的感受:

因为前面做了两道区域求和的……然后思路不由自主又代入到搞【子树最大值】来更新答案……然而忘记了单点更新,也就是:虽然这个子树不合法,但是这一个点(根)还是可能合法的……

然后就是:KD-Tree如果可以搞整个子树的话,那么用整个子树的最值去更新,会优化很多……?

终于1A了一道KD-Tree啦~好开心(虽然不是自己想出的做法……)

一个更加优秀的做法:http://www.cnblogs.com/mhy12345/p/4517347.html

 /**************************************************************
Problem: 3489
User: Tunix
Language: C++
Result: Accepted
Time:3712 ms
Memory:7920 kb
****************************************************************/ //BZOJ 3489
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=1e9;
/*******************template********************/
int n,m,D,a[N],root,ans,now[N],nex[N],pre[N];
struct node{
int d[],mn[],mx[],l,r,v,vmax;
int& operator [] (int i) {return d[i];}
}t[N];
//d[0] 下标
//d[1] nex
//d[2] pre
bool operator < (node a,node b){return a[D]<b[D];} #define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o][i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o][i],max(t[L].mx[i],t[R].mx[i]));
}
t[o].vmax=max(t[o].v,max(t[L].vmax,t[R].vmax));
} int build(int l,int r,int dir){
D=dir;
nth_element(t+l,t+mid,t+r+);
int o=mid;
L = l < mid ? build(l,mid-,(dir+)%) : ;
R = mid < r ? build(mid+,r,(dir+)%) : ;
Push_up(o);
return o;
}
int ql,qr;
inline bool check(int o){
if (!o) return ;
if (t[o].mx[]<=qr || t[o].mn[]>=ql) return ;
if (t[o].mn[]>qr || t[o].mx[]<ql) return ;
return ;
}
void query(int o){
if (!o) return;
if (t[o].mn[]>=ql && t[o].mx[]<=qr && t[o].mn[]>qr && t[o].mx[]<ql){
ans=max(ans,t[o].vmax);
return;
}
if (t[o][]>=ql && t[o][]<=qr && t[o][]>qr && t[o][]<ql)
ans=max(ans,t[o].v);
if (t[L].vmax>t[R].vmax){
if (t[L].vmax>ans && check(L)) query(L);
if (t[R].vmax>ans && check(R)) query(R);
}else{
if (t[R].vmax>ans && check(R)) query(R);
if (t[L].vmax>ans && check(L)) query(L);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("3489.in","r",stdin);
freopen("3489.out","w",stdout);
#endif
F(i,,) t[].mn[i]=INF,t[].mx[i]=-INF;
t[].vmax=-;
n=getint(); m=getint();
F(i,,n) a[i]=getint();
F(i,,n){
pre[i]=now[a[i]];
now[a[i]]=i;
}
F(i,,n) nex[pre[i]]=i;
F(i,,n) if (!nex[i]) nex[i]=n+;
F(i,,n) t[i][]=i,t[i][]=nex[i],t[i][]=pre[i],t[i].v=a[i];
root=build(,n,);
F(i,,m){
int x=getint(),y=getint();
ql=min( (x+ans)%n+,(y+ans)%n+);
qr=max( (x+ans)%n+,(y+ans)%n+);
ans=;
query(root);
printf("%d\n",ans);
}
return ;
}

3489: A simple rmq problem

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 554  Solved: 173
[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

Sample Output

4
10
10
0
0
10
0
4
0
4

HINT

注意出题人为了方便,input的第二行最后多了个空格。

Source

[Submit][Status][Discuss]

【BZOJ】【3489】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

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

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

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

  4. BZOJ3489 A simple rmq problem 【可持久化树套树】*

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

  5. bzoj 3489: A simple rmq problem k-d树思想大暴力

    3489: A simple rmq problem Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 551  Solved: 170[Submit][ ...

  6. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MBSubmit: 1594  Solved: 520[Submit] ...

  7. [BZOJ 3489] A simple rmq problem 【可持久化树套树】

    题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...

  8. 【bzoj 3489】A simple rmq problem

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

  9. 【Bzoj 1835 基站选址】

    基站选址的区间里隐藏着DP优化的机密…… 分析:       不论是做过乘积最大还是石子合并,或者是其他的入门级别的区间DP题目的人呐,大米并认为读题后就能够轻松得出一个简洁明了的Dp转移方程.    ...

随机推荐

  1. Jersey入门二:运行项目

    1.项目有了,在终端窗口进入项目的根目录(即 \simple-service ) 2.现在先测试运行下: mvn clean test  项目将会被编译,并且进行单元测试  上面可以看看到测试通过 ...

  2. structs2的action实现方式

    Action的实现方式第一种:在web.xml中添加配置<filter> <filter-name>struts2</filter-name> <filter ...

  3. CentOS6启动流程(含详细流程图)

    参考:Linux启动流程和grub详解(作者:好笔记运维) 为什么把这位的参考放在前面,主要是这位大佬的流程图太详细了.虽说不一定要了解这么详细,但还是很佩服啊.不多说,上图(在新标签中打开图片) 下 ...

  4. 网络图片嗅探工具driftnet

    网络图片嗅探工具driftnet   图片是网络数据传输的重要内容.Kali Linux内置了一款专用工具drifnet.该工具可以支持实时嗅探和离线嗅探.它可以从数据流中提取JPEG和GIF这两种网 ...

  5. python语法(一)

    Python是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.在近几年,大数据,人工智能火起来之后也是水涨船高,被越来越多的人知道,并且越来越多 ...

  6. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

  7. 【推导】【单调性】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem B. Tribute

    题意:有n个数,除了空集外,它们会形成2^n-1个子集,给你这些子集的和的结果,让你还原原来的n个数. 假设原数是3 5 16, 那么它们形成3 5 8 16 19 21 24, 那么第一轮取出开头的 ...

  8. hdu 3061 最大权闭合子图

    属于模板题吧... #include <cstdio> #include <cstring> #include <vector> #define min(a,b) ...

  9. BZOJ2716 KD-Tree

    好久没写博客了 回去赶了好久文化课 颓欲见长 突然翻到fc爷的KD-Tree板子 来切了到裸题 对于一开始的数据我们可以先预处理 具体的排序方式见板子 其实就是我们对每次选定的一块选一个维度来排序啦 ...

  10. Codeforces Round #288 (Div. 2) B. Anton and currency you all know 贪心

    B. Anton and currency you all know time limit per test 0.5 seconds memory limit per test 256 megabyt ...