题面在这里!

首先一个非常重要的性质是,两个好的区间的交依然是好的区间。

有了这个性质,我们只要找到包含某个区间的右端点最小的好区间,然后就是这个区间的答案拉。

至于找右端点最小的好区间就是一个扫描线问题啦 (和我之前出的那个题有点像,只不过从树上放到了序列上)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100005;
#define pb push_back
#define lc (o<<1)
#define mid (l+r>>1)
#define rc ((o<<1)|1) inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} void W(int x){ if(x>=10) W(x/10); putchar(x%10+'0');} struct ask{
int L,num;
bool operator <(const ask &u)const{
return L<u.L;
}
};
vector<ask> g[N];
multiset<ask> s;
multiset<ask> :: iterator it;
int n,a[N],p[N],mx[N*4],pos[N*4],Q;
int le,ri,w,al[N],ar[N],M,P,tag[N*4]; inline void mt(int o){
mx[o]=max(mx[lc],mx[rc]);
pos[o]=(mx[rc]==mx[o]?pos[rc]:pos[lc]);
} inline void work(int o,int der){ tag[o]+=der,mx[o]+=der;} inline void pd(int o){ if(tag[o]) work(lc,tag[o]),work(rc,tag[o]),tag[o]=0;} void build(int o,int l,int r){
mx[o]=r,pos[o]=r;
if(l==r) return;
build(lc,l,mid),build(rc,mid+1,r);
} void update(int o,int l,int r){
if(l>=le&&r<=ri){ work(o,w); return;}
pd(o);
if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+1,r);
mt(o);
} void query(int o,int l,int r){
if(l>=le&&r<=ri){ if(mx[o]>M) M=mx[o],P=pos[o]; return;}
pd(o);
if(ri>mid) query(rc,mid+1,r);
if(le<=mid) query(lc,l,mid);
} inline bool can(int cc){
le=1,ri=it->L,M=P=0;
query(1,1,n);
if(M==cc){ al[it->num]=P,ar[it->num]=cc; return 1;}
return 0;
} inline void solve(){
build(1,1,n),w=1;
ask inf=(ask){233333,0}; for(int i=1;i<=n;i++){
for(ask x:g[i]) s.insert(x); ri=p[a[i]-1],le=1;
if(ri&&ri<i) update(1,1,n); ri=p[a[i]+1],le=1;
if(ri&&ri<i) update(1,1,n); for(;s.size();s.erase(it)){
it=--s.lower_bound(inf);
if(!can(i)) break;
}
}
} int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout); n=read();
for(int i=1;i<=n;i++) p[a[i]=read()]=i;
Q=read();
for(int i=1,l,r;i<=Q;i++){
l=read(),r=read();
g[r].pb((ask){l,i});
} solve(); for(int i=1;i<=Q;i++) W(al[i]),putchar(' '),W(ar[i]),puts("");
return 0;
}

Gym - 101620I Intrinsic Interval的更多相关文章

  1. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  2. [CERC2017] Intrinsic Interval

    首先理清这奇葩题意表述 给出一个\(1\)到\(n\)的排列\(p[]\)和\(m\)次询问,每次询问覆盖区间\([l,r]\)的最小区间\([a,b]\),满足\([a,b]\)内的元素排序后是连续 ...

  3. [CERC2017]Intrinsic Interval(神仙+线段树)

    题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间. 题解 做法太神了,根本想不到. %%%i207m. 结论:当一个区间 ...

  4. [CERC2017]Intrinsic Interval[scc+线段树优化建图]

    题意 给定一个长度为 \(n\) 的排列,有 \(q\) 次询问,每次询问一个区间 \([l,r]\) ,找到最小的包含 \([l,r]\) 的区间,满足这个区间包含了一段连续的数字. \(n\leq ...

  5. 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间

    题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...

  6. [luogu4747]Intrinsic Interval

    有一个结论,答案一定是所有包含其合法区间中$l$最大且$r$最小的 证明比较容易,考虑两个合法区间有交,那么交必然合法,同时交也必然包含该区间,因此这个区间一定是合法的(取$l$最大的和$r$最小的两 ...

  7. Solution -「Gym 102759F」Interval Graph

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个区间,第 \(i\) 个为 \([l_i,r_i]\),有权值 \(w_i\).设一无向图 \(G=(V=\ ...

  8. 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)

    A. Assignment Algorithm 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string ...

  9. 2017 CERC

    2017 CERC Problem A:Assignment Algorithm 题目描述:按照规则安排在飞机上的座位. solution 模拟. 时间复杂度:\(O(nm)\) Problem B: ...

随机推荐

  1. bzoj 1197 DP

    我们可以将这个问题转化为在n维空间中一共放m个n维球,求这m个球最多将这个空间分为不同的几个部分. 那么我们设w[i][j]代表i为空间放j个球分为的部分,那么w[i][j]=w[i][j-1]+w[ ...

  2. bzoj 1046 LIS

    假设我们知道以每个点开始到最后的最长上升序列,设为w[i],这样首先我们在w值中取max,如果询问的值比max大,这样显然就是无解,如果小的话,我们需要求出来字典序最小的方案. 那么对于所有i,我们肯 ...

  3. css优先级机制

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.   1.important >(内联样式)Inline style  >(内部样式)Internal style sheet ...

  4. 移动端 H5 页面注意事项

    1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶部信号栏的高度. 移动端H5活动页面常常需要能够分享到各种社交App中,常用的有 微信.QQ 等. ...

  5. 【DLL】动态库的创建,隐式加载和显式加载(转)

    原文转自:https://blog.csdn.net/dcrmg/article/details/53437913

  6. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week1 Introduction to deep learning课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week1 Introduction to deep learn ...

  7. python 学记笔记 SQLalchemy

    数据库表是一个二维表,包含多行多列.把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表 ...

  8. 调用start()与run()的区别

    1.调用start()方法: 通知“线程规划器”当前线程已经准备就绪,等待调用线程对象的run()方法.这个过程就是让系统安排一个时间来调用Thread中的run()方法,使线程得到运行,启动线程,具 ...

  9. 1003: FFF团的情侣活动--课程作业--找出N个数字中唯一出现奇数次的数

    1003: FFF团的情侣活动 Time Limit: 1 Sec  Memory Limit: 2 MB Description 圣诞节快到了,Water作为大FFF团团长,组织许多对情侣进行电影院 ...

  10. JVM 类加载过程、初始化、主动引用、被动引用、静态初始化块执行顺序