有一个结论,答案一定是所有包含其合法区间中$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. Linux 下 xargs 命令

    xargs 常常被大家忽略的一个命令,对它的一些用法很多人可能不熟悉,其实它是一个功能强大的命令,特别是在结合管道进行批量处理方面 语法 xargs 语法格式如下 xargs [OPTION]... ...

  2. pip 命令总结

    建议和 Conda 命令一起看,pip 和conda命令有点相似.<Conda 命令> 1 查看帮助文档 pip --help 使用该命令将告诉你 pip 的常用命令. 使用时,输入pip ...

  3. 破解安装pyhotn

    1.网址 https://www.jetbrains.com/pycharm/download/#section=windows,打开页面,点击下载专业版 2.这是下载好的文件,双击运行即可. //详 ...

  4. 架构师必备:MySQL主从延迟解决办法

    上一篇文章介绍了MySQL主从同步的原理和应用,本文总结了MySQL主从延迟的原因和解决办法.如果主从延迟过大,会影响到业务,应当采用合适的解决方案. MySQL主从延迟的表现 先insert或upd ...

  5. 串的模式匹配 BF算法和KMP算法

    设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则 ...

  6. 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇!

    大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 这篇文章我们不谈数据结构了,来谈谈入门分布式踩过的坑.感觉到了分布式这一层,由于技术更新迭代 ...

  7. 解决Mybatis 报错Invalid bound statement (not found)

    解决Mybatis 报错Invalid bound statement (not found) 出现此错误的原因 1.xml文件不存在 2.xml文件和mapper没有映射上 namespace指定映 ...

  8. relativeLayout相对布局的嵌套在py中的引用

    from kivy.app import App from kivy.uix.button import Button from kivy.uix.relativelayout import Rela ...

  9. oo第一单元学习总结

    写在开头: 第一次接触面向对象思想和java语言,在学习以及完成作业的过程经历了一个比较痛苦的过程, 虽然在每次写作业时总是会有一些小小的抱怨,虽然写出的代码还是很差, 但是看到自己有所进步,还是感觉 ...

  10. 使用logstash的grok插件解析springboot日志

    使用logstash的grok插件解析springboot日志 一.背景 二.解决思路 三.前置知识 四.实现步骤 1.准备测试数据 2.编写`grok`表达式 3.编写 logstash pipel ...