有一个结论,答案一定是所有包含其合法区间中$l$最大且$r$最小的

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

将询问离线,类似于[cf997E][https://www.cnblogs.com/PYWBKTDA/p/13912635.html],枚举右端点$r$,维护一棵线段树记录区间$[l,r]$的$(mx-mn)-(r-l)$,相当于判断当前还没有找到最小的$r$的询问中$[1,l]$是否存在

很明显$[1,l]$是否存在与$l$单调,即$l$越大越容易存在,那么维护一个堆,从大到小弹出$l$来判定,时间复杂度即为$o(n\log_{2}n)$(如果存在还要找到最后一次,即维护最后一次出现)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 120005
4 #define pii pair<int,int>
5 #define L (k<<1)
6 #define R (L+1)
7 #define mid (l+r>>1)
8 priority_queue<pii>q;
9 vector<pii>v[N];
10 int n,m,x,y,a[N],mn[N],mx[N],f[N<<2],pos[N<<2],tag[N<<2];
11 pii ans[N];
12 void upd(int k,int x){
13 f[k]+=x;
14 tag[k]+=x;
15 }
16 void up(int k){
17 f[k]=min(f[L],f[R]);
18 if (f[k]==f[R])pos[k]=pos[R];
19 else pos[k]=pos[L];
20 }
21 void down(int k){
22 upd(L,tag[k]);
23 upd(R,tag[k]);
24 tag[k]=0;
25 }
26 void build(int k,int l,int r){
27 f[k]=1;
28 pos[k]=r;
29 if (l==r)return;
30 build(L,l,mid);
31 build(R,mid+1,r);
32 }
33 void update(int k,int l,int r,int x,int y,int z){
34 if ((l>y)||(x>r))return;
35 if ((x<=l)&&(r<=y)){
36 upd(k,z);
37 return;
38 }
39 down(k);
40 update(L,l,mid,x,y,z);
41 update(R,mid+1,r,x,y,z);
42 up(k);
43 }
44 int query(int k,int l,int r,int x,int y){
45 if ((l>y)||(x>r))return 0x3f3f3f3f;
46 if ((x<=l)&&(r<=y))return f[k];
47 down(k);
48 return min(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
49 }
50 int find(int k,int l,int r,int x,int y){
51 if ((f[k])||(l>y)||(x>r))return 0;
52 if ((x<=l)&&(r<=y))return pos[k];
53 down(k);
54 return max(find(L,l,mid,x,y),find(R,mid+1,r,x,y));
55 }
56 int main(){
57 scanf("%d",&n);
58 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
59 scanf("%d",&m);
60 for(int i=1;i<=m;i++){
61 scanf("%d%d",&x,&y);
62 v[y].push_back(make_pair(x,i));
63 }
64 build(1,1,n);
65 for(int i=1;i<=n;i++){
66 update(1,1,n,1,i,-1);
67 while ((mn[0])&&(a[mn[mn[0]]]>a[i])){
68 if (mn[0]==1)update(1,1,n,1,mn[mn[0]],a[mn[mn[0]]]-a[i]);
69 else update(1,1,n,mn[mn[0]-1]+1,mn[mn[0]],a[mn[mn[0]]]-a[i]);
70 mn[0]--;
71 }
72 mn[++mn[0]]=i;
73 while ((mx[0])&&(a[mx[mx[0]]]<a[i])){
74 if (mx[0]==1)update(1,1,n,1,mx[mx[0]],a[i]-a[mx[mx[0]]]);
75 else update(1,1,n,mx[mx[0]-1]+1,mx[mx[0]],a[i]-a[mx[mx[0]]]);
76 mx[0]--;
77 }
78 mx[++mx[0]]=i;
79 for(int j=0;j<v[i].size();j++)q.push(v[i][j]);
80 while (!q.empty()){
81 pii o=q.top();
82 if (query(1,1,n,1,o.first))break;
83 q.pop();
84 ans[o.second]=make_pair(find(1,1,n,1,o.first),i);
85 }
86 }
87 for(int i=1;i<=m;i++)printf("%d %d\n",ans[i].first,ans[i].second);
88 }

[luogu4747]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. Gym - 101620I Intrinsic Interval

    题面在这里! 首先一个非常重要的性质是,两个好的区间的交依然是好的区间. 有了这个性质,我们只要找到包含某个区间的右端点最小的好区间,然后就是这个区间的答案拉. 至于找右端点最小的好区间就是一个扫描线 ...

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

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

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

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

  8. 2017 CERC

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

  9. 【转】The difference between categorical(Nominal ), ordinal and interval variables

    What is the difference between categorical, ordinal and interval variables? In talking about variabl ...

随机推荐

  1. 树莓派4B学习札记

    防静电 树莓派比较容易被静电损坏,要做好以下预防措施 使用的时候不要用手去触摸PCB和针脚!特别是上电之后! 拿板卡的时候,要习惯性拿板卡的边缘 勤洗手,勤摸墙壁,释放身上的静电 系统安装 8GB以上 ...

  2. Apache Shiro漏洞绕过waf小tips

    看了篇文章觉得不错记录下以免以后找不到,原理是通过base64解码特性导致waf不能成功解码绕过waf检测从而进行攻击 解码情况: payload php python openresty java ...

  3. Java泛型背后是什么?

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...

  4. netty传输java bean对象

    在上一篇博客(netty入门实现简单的echo程序)中,我们知道了如何使用netty发送一个简单的消息,但是这远远是不够的.在这篇博客中,我们来使用netty发送一个java bean对象的消息,但是 ...

  5. 无网络下,配置yum本地源

    1. 新建一个没有iso镜像文件的虚拟机: 2. 本地上传一个镜像文件(CentOS7的镜像),到虚拟机已创建的目录: 例如:上传一个镜像文件CentOS-7-x86_64-Everything-17 ...

  6. 模拟赛18 T1 施工 题解

    前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...

  7. QMake(Qt项目构建)

    qmake工具能够简化不同平台上的项目构建.可以自动产生Makefiles文件,仅仅需要少量的信息就可以生成Makefile文件.同时qmake也可以构建不是Qt的项目.qmake基于项目文件中的信息 ...

  8. LP-DDR 和其他 DDR

    一篇技術文檔比較 LP-DDR 和其他 DDR. 就觀念來說,LP-DDR 就是 Low Power 的 DDR:但就架構來說,LP-DDR 和其他 DDR 是截然不同的東西. 他們分屬不同的 JDE ...

  9. 嵌入式单片机stm32之DMA实验

    一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...

  10. 【做题记录】max-min+1=len 区间计数

    (来源:XJ高质量原创题) 原题地址 弱化版:CF526F Pudding Monsters 弱化版 题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出 ...