bzoj 3489 A simple rmq problem —— 主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489
题解:http://www.itdaan.com/blog/2017/11/24/9bc46b690756fe252e17fc3ca90aa01.html
在我挣扎一下午时 Narh 早就A了...
于是看看有何不同,发现 add 和 insert 中必须把 ls[x] = ls[y] , rs[x] = rs[y] 写在前面,而不能是修改 rs 则在那里单写一个 ls[x] = ls[y] 什么的,否则过不了样例...
然后 find 和 query 中一定要有一个 if(!x) return 0; ,否则秒 WA ...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
int const xn=1e5+,xm=xn*,xy=xm*;
int n,m,cnt,rt[xn],ls[xm],rs[xm],cnt2,rt2[xm],ls2[xy],rs2[xy],lst[xn],mx[xy];
struct N{int pr,nxt,pos,val;}p[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
bool cmp(N x,N y){return x.pr<y.pr;}
void add(int &x,int y,int l,int r,N t)
{
x=++cnt2;
ls2[x]=ls2[y]; rs2[x]=rs2[y];
mx[x]=max(mx[y],t.val);
if(l==r)return;
if(t.pos<=mid)add(ls2[x],ls2[y],l,mid,t);
else add(rs2[x],rs2[x],mid+,r,t);
}
void insert(int &x,int y,int l,int r,N t)
{
x=++cnt;
ls[x]=ls[y]; rs[x]=rs[y];
add(rt2[x],rt2[y],,n+,t);//!!!
if(l==r)return;
if(t.nxt<=mid)insert(ls[x],ls[y],l,mid,t);
else insert(rs[x],rs[y],mid+,r,t);
}
int find(int x,int l,int r,int L,int R)
{
if(!x)return ;//!!
if(l>=L&&r<=R)return mx[x];
int ret=;
if(mid>=L)ret=max(ret,find(ls2[x],l,mid,L,R));
if(mid<R)ret=max(ret,find(rs2[x],mid+,r,L,R));
return ret;
}
int query(int x,int l,int r,int L,int R,int ql,int qr)
{
if(!x)return ;//!!
if(l>=L&&r<=R)return find(rt2[x],,n+,ql,qr);
int ret=;
if(mid>=L)ret=max(ret,query(ls[x],l,mid,L,R,ql,qr));
if(mid<R)ret=max(ret,query(rs[x],mid+,r,L,R,ql,qr));
return ret;
}
int main()
{
n=rd(); m=rd();
for(int i=,x;i<=n;i++)
{
x=rd();
p[i].pos=i; p[i].val=x;
p[i].pr=lst[x]; p[lst[x]].nxt=i;
lst[x]=i;
}
for(int i=;i<=n;i++)if(!p[i].nxt)p[i].nxt=n+;
sort(p+,p+n+,cmp); for(int i=,t=;i<=n+;i++)
{
rt[i]=rt[i-];
while(p[t].pr==i&&t<=n)insert(rt[i],rt[i],,n+,p[t++]);
}
for(int i=,x,y,l,r,lt=;i<=m;i++)
{
x=rd(); y=rd();
l=min((x+lt)%n+,(y+lt)%n+);
r=max((x+lt)%n+,(y+lt)%n+);
lt=query(rt[l-],,n+,r+,n+,l,r);//
printf("%d\n",lt);
}
return ;
}
bzoj 3489 A simple rmq problem —— 主席树套线段树的更多相关文章
- 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(主席树 Heap)
题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...
- 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 - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- [BZOJ 3489] A simple rmq problem 【可持久化树套树】
题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...
- BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...
- 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(可持久化线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489 题意:一个数列.每次询问一个区间内出现一次的最大的数字是多少. 思路:设la ...
随机推荐
- server中intersect的用法
intersect 就像数学中的交集一样, select nam from tb_table1 intersect select name from tb_table2 查询的是两个数据集的交集 ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事【网络流】
Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! O ...
- 洛谷P1759 通天之潜水
题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具.由于他还要背重重的背包,所以 ...
- 【贪心+二分】codeforces C. Sagheer and Nubian Market
http://codeforces.com/contest/812/problem/C [题意] 如何花最少的钱买最多的纪念品?首要满足纪念品尽可能多,纪念品数量一样花钱要最少,输出纪念品数量以及最少 ...
- Lucene、Compass学习以及与SSH的整合
一.准备 个人在学习中采用Struts2 + Hibernate3.2 + Spring2.5 + Compass2.2.0, 一下图片为本次学习中用到的jar包: 图中圈出的jar包为本次学习的主要 ...
- hdu3853:LOOPS
题目大意:r*c个点,每个点有Aij的概率回到自己本身,Bij的概率向右一格,Cij的概率向下一格,求从(1,1)到(r,c)的期望步数. 题解:有了hdu4405的经验,从后往前推期望.那么,E(i ...
- Android Notification通知简介
Android Notification通知简介 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面 ...
- msp430项目编程13
msp430中项目---温湿度检测系统 1.dht11工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- 有向图欧拉回路个数 BEST定理
有向图欧拉回路个数 BZOJ 3659 但是没有这道题了 直接贴一个别人的板子吧 欧拉回路:存在一条路径经过所有的边刚好1次 有向图欧拉回路存在充要条件:①图连通:②对于所有点都满足出度=入度 BE ...
- [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4896 Solved: 1824[Submit][Statu ...