[CERC2017]Intrinsic Interval(神仙+线段树)
题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间。
题解
做法太神了,根本想不到。
%%%i207m。
结论:当一个区间中相邻的数的对数等于区间长度-1,那么这个区间是好的区间,证明:*%%%%……*%%¥。
所以我们可以用扫描线对1-n扫一遍,用线段树维护i-now的相邻的数的对数,如果我们令a[i]+=i;那么当我们做到r时且a[l]=r,那么l到r是好区间。
然后我们对于每个询问按照l从大到小做,如果找不到就break掉。
代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#define N 100002
using namespace std;
int tr[N<<],la[N<<],mx[N<<],nowma,ga,zuo,n,pos[N],m,ansl[N],ansr[N],a[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
struct Q{
int l,r,id;
bool operator <(const Q &b)const{return l<b.l;}
};
vector<Q>vec[N];
priority_queue<Q>q;
inline void pushdown(int cnt){
tr[cnt<<]+=la[cnt];tr[cnt<<|]+=la[cnt];
la[cnt<<]+=la[cnt];la[cnt<<|]+=la[cnt];
la[cnt]=;
}
inline void pushup(int cnt){
tr[cnt]=tr[cnt<<];mx[cnt]=mx[cnt<<];
if(tr[cnt<<|]==tr[cnt])mx[cnt]=max(mx[cnt],mx[cnt<<|]);
else if(tr[cnt<<|]>tr[cnt])tr[cnt]=tr[cnt<<|],mx[cnt]=mx[cnt<<|];
}
void build(int cnt,int l,int r){
if(l==r){tr[cnt]=l;mx[cnt]=l;return;}
int mid=(l+r)>>;
build(cnt<<,l,mid);build(cnt<<|,mid+,r);
pushup(cnt);
}
void upd(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R){tr[cnt]++;la[cnt]++;return;}
int mid=(l+r)>>;
if(la[cnt])pushdown(cnt);
if(mid>=L)upd(cnt<<,l,mid,L,R);
if(mid<R)upd(cnt<<|,mid+,r,L,R);
pushup(cnt);
}
void query(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R){
if(tr[cnt]>=nowma){nowma=tr[cnt];zuo=mx[cnt];}
return;
}
int mid=(l+r)>>;
if(la[cnt])pushdown(cnt);
if(mid>=L)query(cnt<<,l,mid,L,R);
if(mid<R)query(cnt<<|,mid+,r,L,R);
}
inline bool pd(Q a){
int l=a.l,r=a.r,id=a.id;nowma=;
query(,,n,,l);
// cout<<nowma<<" __ "<<ga<<endl;
if(nowma==ga){
ansl[id]=zuo;ansr[id]=ga;return ;
}
return ;
}
int main(){
n=rd();
build(,,n);
for(int i=;i<=n;++i)a[i]=rd(),pos[a[i]]=i;
m=rd();
for(int i=;i<=m;++i){
int l=rd();int r=rd();
vec[r].push_back(Q{l,r,i});
}
for(int i=;i<=n;++i){
ga=i;
if(a[i]>&&pos[a[i]-]<=i)upd(,,n,,pos[a[i]-]);
if(a[i]<n&&pos[a[i]+]<=i)upd(,,n,,pos[a[i]+]);
for(int j=;j<vec[i].size();++j)q.push(vec[i][j]);
while(!q.empty()){if(pd(q.top()))q.pop();else break;}
}
for(int i=;i<=m;++i)printf("%d %d\n",ansl[i],ansr[i]);
return ;
}
[CERC2017]Intrinsic Interval(神仙+线段树)的更多相关文章
- [CERC2017]Intrinsic Interval[scc+线段树优化建图]
题意 给定一个长度为 \(n\) 的排列,有 \(q\) 次询问,每次询问一个区间 \([l,r]\) ,找到最小的包含 \([l,r]\) 的区间,满足这个区间包含了一段连续的数字. \(n\leq ...
- [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树
[CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...
- 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间
题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...
- 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)
HDU 5489 Removed Interval 题意: 求序列中切掉连续的L长度后的最长上升序列 思路: 从前到后求一遍LIS,从后往前求一遍LDS,然后枚举切开的位置i,用线段树维护区间最大值, ...
- [CERC2017] Intrinsic Interval
首先理清这奇葩题意表述 给出一个\(1\)到\(n\)的排列\(p[]\)和\(m\)次询问,每次询问覆盖区间\([l,r]\)的最小区间\([a,b]\),满足\([a,b]\)内的元素排序后是连续 ...
- LOJ2319. 「NOIP2017」列队【线段树】
LINK 思路 神仙线段树 你考虑怎么样才能快速维护出答案 首先看看一条链怎么做? 首先很显然的思路是维护每个节点的是否出过队 然后对于重新入队的点 直接在后面暴力vector存一下就可以了 最核心的 ...
- UOJ #164 [清华集训2015]V (线段树)
题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...
- Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
随机推荐
- 【Python3练习题 002】企业发放的奖金根据利润提成
# [Python练习题 002]企业发放的奖金根据利润提成.# 利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分, ...
- js-其他跨域技术(JSONP`Comet)
###1. JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...
- Day 6-1计算机网络基础&TCP/IP
按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层(我们只需要掌握tcp/ip五层协议即可) 每层运行常见物理设备: TCP/IP协议: Transmission Con ...
- 【git】git add 添加错文件 撤销
git add 添加 多余文件 这样的错误是由于, 有的时候 可能 git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件 git add 如果添加了错误的文件的话 撤销操 ...
- Android——SMS接收发短信与运行权限
好久没写了,最近学习Android的相关知识,包括UI组件与布局.Activity生命周期等,而这次要讲的是,Broadcast Receiver的相关知识,主要是接收发短信,SmsManager.S ...
- 区分Python中的可变对象和不可变对象
参考: https://www.cnblogs.com/sun-haiyu/p/7096918.html """不过注意函数传参既不是传值也不是传引用,正确的叫法是传对象 ...
- Json dump
json 模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多. 下面 ...
- Unable to handle kernel paging request at virtual address
1.Unable to handle kernel paging request at virtual address 00000000 =====>越出内核地址空间范围,原因是由于使用空NUL ...
- ajax获得后台传来的一个json值,在js中获得其中的属性值
首先 ajax的dataType需要设置为json, 默认的text获取属性值在jquery3.2.1中尝试不成功 获得属性值的方式: 类似数组,键值对的方式 下面例子: 设置dataType为jso ...
- java静态工厂
本文摘自:https://www.jianshu.com/p/ceb5ec8f1174 本文略长,所以先来个内容提要 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器 ...