有一个结论,答案一定是所有包含其合法区间中$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. 阿里 Midway 正式发布 Serverless v1.0,研发提效 50%

    Github:https://github.com/midwayjs/midway 开源为了前端和 Node.js 的发展,点 Star! 去年阿里提出 Serverless 架构,并利用其新一代研发 ...

  2. C 函数指针 函数指针数组 转移表

    内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...

  3. Redis 高阶数据类型重温

    今天这个专题接着上一篇 Redis 的基本数据类型 继续讲解剩下的高阶数据类型:BitMap.HyperLogLog 和 GEO hash.这些数据结构的底层也都是基于我们前面说的 5 种 基本类型, ...

  4. 【UE4】虚幻引擎技术直播汇总(含中英文直播)

    B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...

  5. Microsoft Porject Online 学习随手记一:环境创建和数据导入

    没有想像的简单,也没那么复杂 Project OL之前是Dynamics 365 Enterprise P1中的一个模块,目前最新版本只能简单创建并且已经没有Enterprise P1选项. 主要流程 ...

  6. 反调试——11——检测TF标志寄存器

    反调试--11--检测TF标志寄存器 在intel的x86寄存器中有一种叫标志寄存器: 标志寄存器中的TF(Trap Flag)位,CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则会产生 ...

  7. 【二食堂】Alpha - Scrum Meeting 4

    Scrum Meeting 4 例会时间:4.14 12:30 - 12:50 进度情况 组员 昨日进度 今日任务 李健 1. 主页面的搭建工作issue 1. 完成主页搭建**issue2. 与后端 ...

  8. java中生成和验证jwt

    在这篇文章中主要记录一下在Java中如何使用 java 代码生成jwt token,主要是使用jjwt来生成和验证jwt,关于什么是JWT,以及JWT可以干什么不做详解. jwt的格式: base64 ...

  9. 微信小程序的实现原理

    一.背景 网页开发,渲染线程和脚本是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应的原因,本质就是我们常说的 JS 是单线程的 而在小程序中,选择了 Hybrid 的渲染方式,将视图层和逻 ...

  10. 2021.10.7 NKOJ周赛总结

    Ⅰ. 自描述序列 问题描述: 序列 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,... 看似毫无规律,但若我们将相邻的数字合并 : 1,22,11,2,1,22,1 ...