区间逼近 牛客寒假1 小a的排列
做法:模拟
萌区间也就是这个区间里的数是一段连续的数
做法的话是先找出题目x,y的位置,记为l,r,然后找出l,r内的最大最小值,又因为萌区间要求数是连续的,就从这段连续数最小的开始到最大的,确定缩放区间的左右端点,但现在这个缩放区间可能还包含有别的区间,我们就开始拓展拓展答案区间
主要是要注意两点,首先这个序列是个排列(所以它不会有重复数字出现),于是由这个我们可以推出一个显然的结论就是r−l=max[l,r]−min[l,r]r−l=max[l,r]−min[l,r]时这是个连续区间。
然后我们处理出每个数字出现的位置,于是可以求出第一个可能满足题目要求的区间,记为[ql,qr][ql,qr],并保存这个区间的最大最小值。
(为什么是可能呢?因为你现在只求出了x到y之间的数所需要的最短的区间,但是你并不知道这个区间里有没有其他不应该有的数字,让这个区间变得真正合法,就是我们下面要做的事情)
设每个数出现的位置为pospos。
我们可以将原始区间记为[l,r][l,r](即一开始的[pos[x],pos[y]][pos[x],pos[y]])。
尝试不断拓展这个区间[l,r][l,r],在拓展过程中如果出现了大于最大值,或者小于最小值的,就用一开始处理[ql,qr][ql,qr]的方法更新[ql,qr][ql,qr]。直至两区间重合。那么此时的[l,r][l,r]即为答案了。
这样做是O(n)O(n)的,不过常数可能稍大,因为会有重复访问。
写了RMQ的话就可以稳定O(n)O(n)了(不过预处理要O(nlogn)O(nlogn),所以大概实际效率上是没什么大的区别的)
#include <bits/stdc++.h>
using namespace std;
const int inf=<<;
typedef long long ll;
const double pi=acos(-);
const int mod=1e9+;
const int maxn=1e5+;
int a[maxn],pos[maxn];
int main(){
int n,x,y;scanf("%d%d%d",&n,&x,&y);int mx=,mn=n;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
pos[a[i]]=i;
}
int ql=n,qr=,l=pos[x],r=pos[y];
if(l>r) swap(l,r);//这点特别容易错,要当心
for(int i=l;i<=r;i++){//这个是找出了当前区间最大最小值
mx=max(mx,a[i]);
mn=min(mn,a[i]);
}
for(int i=mn;i<=mx;i++){//这个是找出了当前区间左右端点
ql=min(ql,pos[i]);
qr=max(qr,pos[i]);
}
//此时找出的左右端点一定不小于我们要找的答案,其中可能会包含有其他数
while(l!=ql || r!=qr){
while(l!=ql){
l--;int t=a[l];
while(mx<t){
ql=min(ql,pos[++mx]);
qr=max(qr,pos[mx]);
}
while(mn>t){
ql=min(ql,pos[--mn]);
qr=max(qr,pos[mn]);
}
}
while(r!=qr){
r++;int t=a[r];
while(mx<t){
ql=min(ql,pos[++mx]);
qr=max(qr,pos[mx]);
}
while(mn>t){
ql=min(ql,pos[--mn]);
qr=max(qr,pos[mn]);
}
}
}
cout<<l<<" "<<r<<endl;
return ;
}
区间逼近 牛客寒假1 小a的排列的更多相关文章
- 欧拉函数 牛客寒假1 小a与黄金街道
题目链接 分析:这题用到了欧拉函数, 欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数目 详细可以看看这篇博文https://www.cnblogs.com/linyujun/p ...
- 2020牛客寒假算法基础集训营2 J题可以回顾回顾
2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...
- 2020牛客寒假算法基础集训营1 J题可以回顾回顾
2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...
- 牛客寒假算法基础集训营3处女座和小姐姐(三) (数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 区间加值,区间gcd, 牛客949H
牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...
- 欧拉函数-gcd-快速幂(牛客寒假算法基础集训营1-D-小a与黄金街道)
题目描述: 链接:https://ac.nowcoder.com/acm/contest/317/D来源:牛客网小a和小b来到了一条布满了黄金的街道上.它们想要带几块黄金回去,然而这里的城管担心他们拿 ...
- 牛客寒假算法基础训练集中营4 E题 Applese 涂颜色
链接:https://ac.nowcoder.com/acm/contest/330/E 来源:牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列 ...
- 牛客寒假算法基础集训营4 F Applese 的大奖
链接:https://ac.nowcoder.com/acm/contest/330/H来源:牛客网 Applese 和它的小伙伴参加了一个促销的抽奖活动,活动的规则如下:有一个随机数生成器,能等概率 ...
- 牛客寒假6-F十字阵列
链接:https://ac.nowcoder.com/acm/problem/201986来源:牛客网 题目描述 小 Q 新学会了一种魔法,可以对一个 N行M列 的网格上的敌人造成伤害 第 i 次使用 ...
随机推荐
- 【字符串区别】SQLServer中char、varchar、nchar、nvarchar的区别:
一.定义 char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符 ...
- sql 指定数据库中的信息操作
查是否有该表名 SELECT * FROM sys.objects WHERE name='表名'查表字段的信息select * from syscolumns where id=Object_Id( ...
- 【JS】JavaScript中innerHTML与innerText,createTextNode的区别
innerHTML和innerText 它们都会把元素内内容替换掉,区别在于: innerHTML 会把替换内容里的 HTML 标记解释执行. innerText 会把替换内容里的 HTML 标记原样 ...
- pgAdmin的数据导入之CSV
在向数据库批量导入数据时,可以参考此过程 1.对于现有的Excel文件,首先应另存为 .csv文件,记住分割符(逗号分割),在后边导入用到. 2.用记事本打开保存后的csv文件,以utf-8格式另存为 ...
- Jenkins-Linux环境搭建
一.安装jdk.tomcat等 1. JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...
- Git回顾
抄自廖雪峰的官方网站 完整图文请访问https://github.com/Mrlution/study/tree/master/git 关于repository 我认为repository是一个存放代 ...
- 2017"百度之星"程序设计大赛 - 初赛(A) 01,05,06
小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- ORA-00604的解决方法
分类: Oracle 从错误的角度可以推出:应该是表空间不足 根据查看表空间的使用情况: select b.file_name 物理文件名, b.tablespace_name 表空间, b.by ...
- synchronized和volatile
迄今为止,看到的最清楚的一篇: https://zhuanlan.zhihu.com/p/29866981 volatile https://zhuanlan.zhihu.com/p/34362413
- vue定义全局方法 调用其他组件的方法
官网的写法 vue实例.$on就可以在根实例上定义全局方法 this.$root就是获取根实例 如果没有根实例 就表示当前实例 this.$root.$on 不需要.eventHub 不需要下面这 ...