区间逼近 牛客寒假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 次使用 ...
随机推荐
- 【做题】arc078_f-Mole and Abandoned Mine——状压dp
题意:给出一个\(n\)个结点的联通无向图,每条边都有边权.令删去一条边的费用为这条边的边权.求最小的费用以删去某些边使得结点\(1\)至结点\(n\)有且只有一条路径. \(n \leq 15\) ...
- 操作系统04_IO管理
输入输出系统 IO系统的层次结构 用户层IO软件 设备独立性软件 设备驱动程序 中断处理程序 对IO设备的控制方式 使用轮询的可编程IO方式 cpu不停地检查设备的状态,以字节为单位,非中断方式,利用 ...
- 第五个神奇的电梯(代码抢先看<1>)
关于一些自认为比较独特的设计思路,也不知道是好还是坏,放在这里让大家一起看一下. 关于mian函数:因为采用了注册机制所以主函数比较简单. #include "stdafx.h" ...
- Bytomd 助记词恢复密钥体验指南
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 背景知识 ...
- 2-4、nginx特性及基础概念-nginx web服务配置详解
Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...
- 18. --plic--=--ply--=--pli--=--ple--=--plex--=--plo-- to fold 倍,重,折叠 (词19、20)
词汇速记20
- Ajax - 发送请求原理
1,什么是ajax? Asynchronous JavaScript and XML(当然现在xml已经由json代替): 主要是用于前后台的交互(表单提交已经被废弃): 使用场景:前台获取数据.表单 ...
- 简单Promise回顾
1:传统的CallBack回调函数let ajax=function(callback){ //dosomething this.setTimeout(()=>{ callback&&a ...
- _lottery
通过积分购买彩票,奖励以积分形式发放 当aaa_chance,max_chance,min_chance均为0时,自动计算系统最小积分开销进行开奖
- synchronized和volatile
迄今为止,看到的最清楚的一篇: https://zhuanlan.zhihu.com/p/29866981 volatile https://zhuanlan.zhihu.com/p/34362413