[luogu4747]Intrinsic Interval
有一个结论,答案一定是所有包含其合法区间中$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的更多相关文章
- [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树
[CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...
- [CERC2017] Intrinsic Interval
首先理清这奇葩题意表述 给出一个\(1\)到\(n\)的排列\(p[]\)和\(m\)次询问,每次询问覆盖区间\([l,r]\)的最小区间\([a,b]\),满足\([a,b]\)内的元素排序后是连续 ...
- [CERC2017]Intrinsic Interval(神仙+线段树)
题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间. 题解 做法太神了,根本想不到. %%%i207m. 结论:当一个区间 ...
- [CERC2017]Intrinsic Interval[scc+线段树优化建图]
题意 给定一个长度为 \(n\) 的排列,有 \(q\) 次询问,每次询问一个区间 \([l,r]\) ,找到最小的包含 \([l,r]\) 的区间,满足这个区间包含了一段连续的数字. \(n\leq ...
- Gym - 101620I Intrinsic Interval
题面在这里! 首先一个非常重要的性质是,两个好的区间的交依然是好的区间. 有了这个性质,我们只要找到包含某个区间的右端点最小的好区间,然后就是这个区间的答案拉. 至于找右端点最小的好区间就是一个扫描线 ...
- 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间
题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...
- 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
A. Assignment Algorithm 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string ...
- 2017 CERC
2017 CERC Problem A:Assignment Algorithm 题目描述:按照规则安排在飞机上的座位. solution 模拟. 时间复杂度:\(O(nm)\) Problem B: ...
- 【转】The difference between categorical(Nominal ), ordinal and interval variables
What is the difference between categorical, ordinal and interval variables? In talking about variabl ...
随机推荐
- 自定义view---仪表盘--kotlin
我们知道一个自定义view一般来说需要继承view或者viewGroup并实现onMeasure, onLayout, onDraw方法. 其中onMeasure用于测量计算该控件的宽高, onLay ...
- SpringBoot整合Mabatis
1.导入 MyBatis 所需要的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...
- Go语言核心36讲(Go语言进阶技术一)--学习笔记
07 | 数组和切片 我们这次主要讨论 Go 语言的数组(array)类型和切片(slice)类型. 它们的共同点是都属于集合类的类型,并且,它们的值也都可以用来存储某一种类型的值(或者说元素). 不 ...
- NX二次开发-调内部函数UGS::UICOMP_enum::set_width(int)更改BlockUI的枚举控件宽度
版本 NX11+VS2013 内容说明 这个内部函数的设置方法,我之前不会,是QQ群里的一位大佬分享出来的. 关于这块,我也百度搜了一下,找到了几个相关的. 1.直接手动修改BlockUI界面 在低版 ...
- Vue3学习(六)之使用Vue3进行数据绑定及显示列表数据
一.写在前面 说来还是比较惭愧的,从周二开始事就比较多,周三还电脑坏了,然后修电脑等等一些杂事,忙的团团转,因为周二.周三自己走的过多了,导致不敢直腰,周四卧床一天. 之前都听说<陈情令> ...
- 【Spring】IoC容器 - 依赖来源
前言 上一篇文章已经学习了[依赖注入]相关的知识,这里详细的介绍一下[依赖来源]. 依赖来源 我们把依赖来源分为依赖查找的来源和依赖注入的来源分别讨论. 依赖查找的来源 1. Spring BeanD ...
- js判断移动端浏览器类型,微信浏览器、支付宝小程序、微信小程序等
起因 现在市场上各种跨平台开发方案百家争鸣各有千秋,个人认为最成熟的还是hybird方案,简单的说就是写H5各种嵌入,当然作为前端工程师最希望的也就是公司采用hybird方案当作技术路线. 所谓的hy ...
- 渗透测试神器——Burp的使用
公众号:白帽子左一 版本说明:Burp Suite2.1 下载地址: 链接:https://pan.baidu.com/s/1JPV8rRjzxCL-4ubj2HVsug 提取码:zkaq 使用环境: ...
- UVA-1016 Silly Sort
UVA-1016 题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的. 首先,显然需要交换的数一定会形成环: 那么对于每一个环,我们有两 ...
- 设计的MOS管三极管简单开关电路驱动能力不够3
16楼说得非常明白,补充一点,R3如果不要,会有下冲产生.4 Q: Z/ G G1 s8 Z- } 能解释下为什么会产生过冲吗?9 i, P* D* X) u. t/ b ^ 让我们这些菜鸟学习学 ...