BZOJ 3489 A simple rmq problem(可持久化线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489
题意:一个数列。每次询问一个区间内出现一次的最大的数字是多少。
思路:设last[i]表示i位置的数字上一次出现的位置,next[i]类似。那么询问区间[L,R]时,这个区间的哪些数字可以只出现一次呢?是那些last值小于L且next值大于R的数字。因此按照last排序后,按照last可持久化。具体看代码吧 不好说
const int N=100005; struct node
{
int val,last,next,id;
}; node b[N];
int last[N],next[N],n,m; struct Node1
{
int Max;
int L,R;
}; struct Node2
{
int root;
int L,R;
}; Node1 A[40000005];
Node2 a[N*20];
int ANum,aNum; int cmp(node a,node b)
{
return a.last<b.last;
} int root[N]; void insert1(int &t,int L,int R,int pos,int val)
{
int cur=++ANum;
A[cur]=A[t];
t=cur;
A[t].Max=max(A[t].Max,val); if(L==R) return; int M=(L+R)>>1;
if(pos<=M) insert1(A[t].L,L,M,pos,val);
else insert1(A[t].R,M+1,R,pos,val);
} void insert(int &t,int L,int R,int posX,int posY,int val)
{
int cur=++aNum;
a[cur]=a[t];
t=cur;
insert1(a[t].root,1,n,posY,val);
if(L==R) return;
int M=(L+R)>>1;
if(posX<=M) insert(a[t].L,L,M,posX,posY,val);
else insert(a[t].R,M+1,R,posX,posY,val);
} int query1(int t,int L,int R,int ll,int rr)
{
if(!t) return 0;
if(L==ll&&R==rr) return A[t].Max;
int M=(L+R)>>1;
if(rr<=M) return query1(A[t].L,L,M,ll,rr);
if(ll>M) return query1(A[t].R,M+1,R,ll,rr);
int ans1=query1(A[t].L,L,M,ll,M);
int ans2=query1(A[t].R,M+1,R,M+1,rr);
return max(ans1,ans2);
} int query(int t,int L,int R,int ll,int rr,int ll1,int rr1)
{
if(L==ll&&R==rr) return query1(a[t].root,1,n,ll1,rr1);
int M=(L+R)>>1;
if(rr<=M) return query(a[t].L,L,M,ll,rr,ll1,rr1);
if(ll>M) return query(a[t].R,M+1,R,ll,rr,ll1,rr1);
int ans1=query(a[t].L,L,M,ll,M,ll1,rr1);
int ans2=query(a[t].R,M+1,R,M+1,rr,ll1,rr1);
return max(ans1,ans2);
} int main()
{
//FFF; n=getInt(); m=getInt();
int i;
for(i=1;i<=n;i++) b[i].val=getInt(),b[i].id=i,last[i]=0,next[i]=n+1;
for(i=1;i<=n;i++)
{
b[i].last=last[b[i].val];
last[b[i].val]=i;
}
for(i=n;i>=1;i--)
{
b[i].next=next[b[i].val];
next[b[i].val]=i;
}
sort(b+1,b+n+1,cmp);
int j=1;
for(i=0;i<n;i++)
{
if(i) root[i]=root[i-1];
while(j<=n&&b[j].last==i)
{
insert(root[i],0,n+1,b[j].next,b[j].id,b[j].val);
j++;
}
} int ans=0;
while(m--)
{
int L=getInt();
int R=getInt();
L=(L+ans)%n+1;
R=(R+ans)%n+1;
if(L>R) swap(L,R);
ans=query(root[L-1],0,n+1,R+1,n+1,L,R);
printf("%d\n",ans);
}
}
BZOJ 3489 A simple rmq problem(可持久化线段树)的更多相关文章
- BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...
- 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][ ...
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- [BZOJ 3489] A simple rmq problem 【可持久化树套树】
题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- bzoj 3489 A simple rmq problem——主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- bzoj 3489 A simple rmq problem —— 主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- BZOJ 3489: A simple rmq problem (KD-tree做法)
KD树水过这道可持久化树套树-其实就是个三维偏序 题解戳这里 CODE #include <bits/stdc++.h> using namespace std; #define ls ( ...
- BZOJ.3489.A simple rmq problem(主席树 Heap)
题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...
随机推荐
- ajax中网页传输(三)XML——下拉列表显示练习
XML:页面之间传递数据,跨平台传递 HTML:超文本标记语言,核心标签 XML的形势为 <xml version='1.0'> <Nation> <one> &l ...
- css3颜色渐变
从上到下的线性渐变: #grad { background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ backgrou ...
- 10个免费的PHP编辑器/开发工具
转自: http://www.iteye.com/news/22672 一个好的编辑器或开发工具,能够极大提高我们的开发效率.下面介绍10个免费.强大的PHP编辑器/开发工具.这些编辑器拥有调试器.增 ...
- 安装Debian的正确方法
一.说明: Debian7.0.0的安装镜像文件有3个DVD,安装基本系统只用到第一个镜像文件,即DVD1 其它镜像文件是附带的软件包. 附Debian 7.0.0系统镜像下载地址: 32位:http ...
- 一段OpenGL的简单代码
这是基于OpenGL的代码,把它放进draw中即可.渲染出来的效果还不错 #define PI 3.14159 #define N 100 void test::Draw() { glClearCol ...
- SQL Server 索引视图 聚簇索引
创建示例: 朋友的网站速度慢,让我帮忙看下,他用的SQL Server里面 有一个文章表里面有30多万条记录 还有一个用户表里面也差不多17万记录 偏偏当初设计的时候没有冗余字段 很多帖子信息需要JO ...
- 操作系统双语阅读 - Schedulers调度器2
Most processes can be described as either I/O bound or CPU bound. 大多数进程都可以描述为IO绑定或者CPU绑定. An I/O-bou ...
- seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码
seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码 网页摘要是搜索引擎搜索结果下的几行字,用户能通过网页摘要迅速了解到网页的大概内容,传统的摘要是纯文字摘要,而结 ...
- 使用PowerDesigner生成Access数据库
PowerDesigner生成Access数据库 自从使用PD以来一直知道可以支持access但一直没有搞明白如何通过脚本来创建access数据表.在PD的tools里终于找到的答案,具体 文件都在C ...
- Hibernate API申明事务边界
在Hibernate API中,Session和Transaction接口提供了以下声明事务边界的方法: 声明事务的开始边界: Transaction tx = session.beginTransa ...