【高手训练】【RMQ】奶牛排队
第一题由于过水,就没写awa


大概就是这样了。
题意就是求一个最长的区间使得区间的左边是它的最小值,区间右边是他的最大值
第一个想法肯定是暴力枚举啦awa
但是这个是O(n^3)的,绝对的不可过awa
思考性质awa
发现我们枚举每个区间的左右端点,其实有大量的不合法的计算的
也就是没有用的枚举。
考虑怎么避开不合法区间的枚举。
那么就不要先考虑区间的范围。
先考虑合法性,也就是直接寻找符合条件的区间
考虑区间合法满足的条件。
首先,在一个区间中肯定是要满足最大值的位置max要在最小值的位置min后面的,即使max>min
可以发现,如果这个是存在的话,答案肯定是要尝试更新的。
如果不能更新的话,那么这个区间不代表就没有答案了。
所以我们还需要考虑一下在哪里会有答案。
对于一个max<min的区间
我们把他分为3个区间

其中的max和min的位置就是最大值和最小值的位置。
因为max在min的后面,所以这整个大区间就不可能会有答案。
所以我们就用max为右边界,min为左边界,再次分割出两个区间。
这就是区间1和3的由来。
区间2是剩下的。
awa
然后对于中间有解的情况
就是这样的

其中的区间2是已经有解的了,所以我们顶着min和max再次分割出两个区间。
就是区间1和3.
然后进行递归,就是答案了。
为了快速的统计最大值和最小值以及他们的位置,我们就用st表(这非常的显而易见)
然后就没了。
awa
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[100001];
ll maxn[100001][27],b[100001][27];
ll minn[100001][27],c[100001][27];
ll ans,logn[100001];
inline ll read()
{
char c=getchar();ll a=0,b=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;
return a*b;
}
void get_maxx(ll x,ll y)//为了记录最大值和最小值的位置而被魔改的转移
{
if(maxn[x][y-1]<maxn[x+(1<<y-1)][y-1])
{
maxn[x][y]=maxn[x+(1<<y-1)][y-1];
b[x][y]=b[x+(1<<y-1)][y-1];
}
else
{
maxn[x][y]=maxn[x][y-1];
b[x][y]=b[x][y-1];
}
}
void get_minn(ll x,ll y)
{
if(minn[x][y-1]<minn[x+(1<<y-1)][y-1])
{
minn[x][y]=minn[x][y-1];
c[x][y]=c[x][y-1];
}
else
{
minn[x][y]=minn[x+(1<<y-1)][y-1];
c[x][y]=c[x+(1<<y-1)][y-1];
}
}
ll gax(ll l,ll r)
{
ll s=logn[(-l)+r+1];
if(maxn[l][s]<maxn[r-(1<<s)+1][s])return b[r-(1<<s)+1][s];
else return b[l][s];
}
ll gin(ll l,ll r)
{
ll s=logn[(-l)+r+1];
if(minn[l][s]>minn[r-(1<<s)+1][s])return c[r-(1<<s)+1][s];
else return c[l][s];
}
void Find(ll l,ll r)
{
ll x=gin(l,r),y=gax(l,r);
if(x==y)return ;
else
{
if(x<y)
{
ans=max(ans,(-x)+y+1);
if(abs(x-l)>ans)Find(l,x-1);
if(abs(r-y)>ans)Find(y+1,r);
}
else//x>y
{
if(abs(y-x)-1>ans)Find(y+1,x-1);
if(abs(l-y)+1>ans)Find(l,y);
if(abs(r-x)+1>ans)Find(x,r);
}
}
}
int main()
{
n=read();
logn[0]=-1;
for(ll i=1;i<=n;i++)
a[i]=minn[i][0]=maxn[i][0]=read(),c[i][0]=b[i][0]=i,logn[i]=logn[i>>1]+1;
for(ll j=1;j<=19;j++)
{
for(ll i=1;i+(1<<j)-1<=n;i++)
{
get_maxx(i,j);
get_minn(i,j);
}
}
Find(1,n);
cout<<ans<<endl;
return 0;
}
【高手训练】【RMQ】奶牛排队的更多相关文章
- NOIP2012模拟试题 121105【奶牛排队(tahort)
3.奶牛排队(tahort) [ 问题描述] 奶牛在熊大妈的带领下排成了一条直队. 显然,不同的奶牛身高不一定相同…… 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的 ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- 算法训练 安慰奶牛(节点有权值的MST)
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路, ...
- WOJ1109 奶牛排队
题目链接: WOJ1109 题目描述: 奶牛在熊大妈的带领下排成了一条直队. 显然,不同的奶牛身高不一定相同-- 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最 ...
- java实现 蓝桥杯 算法训练 安慰奶牛
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路, ...
- USACO 奶牛排队
题目:给出一个只含有1,2,3的数字序列,问最少交换多少次才能将之变为递增数列. 解: 注意到只有1,2,3,我们只要将1,3交换到自己的应在位置上那么排序就已经完成了. 需要交换的有几种,记$a(x ...
- 一本通 高手训练 1788 爬山 dp 斜率 凸包
LINK:爬山 很早以前看的题目 发现自己想的完全不对 这道题还是比较有价值的. 先不考虑走的路线问题 考虑某个点能看到的最高的山. 分左边和右边来考虑 考虑左边 利用单调栈存长度单调递减的山 不能直 ...
- 一本通 高手训练 1782 分层图 状压dp
LINK:分层图 很精辟的一道题 写的时候没带脑子 导致搞了半天不知道哪错了. 可以想到状压每次到某一层的状态 然后这个表示方案数 多开一维表示此时路径条数的奇偶即可. 不过显然我们只需要知道路径条数 ...
- 一本通 高手训练 1781 死亡之树 状态压缩dp
LINK:死亡之树 关于去重 还是有讲究的. 题目求本质不同的 具有k个叶子节点的树的个数 不能上矩阵树. 点数很少容易想到装压dp 考虑如何刻画树的形状 发现一个维度做不了 所以. 设状态 f[i] ...
- duoxiao OJ #910 【高手训练】【动态规划】梦中漫步 期望 LCA
LINK:梦中漫步 当然也可以去一本通的Oj/loj上交(loj可能没有.. 期望好题.期望和dp往往是在一起的. 前置知识:1. 期望是线性可加的.2.和的期望等于期望的和. 从u出发每次随机选一条 ...
随机推荐
- Aerospike架构设计与实现细节
目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3 ...
- 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
2023-07-01:redis过期策略都有哪些?LRU 算法知道吗? 答案2023-07-01: 缓存淘汰算法(过期策略) 当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换 ...
- Windows/DOS与Unix文件格式之间的相互转换(/r/n问题)
PS:今天遇到一个文件转换问题,现在将网上搜索到资料贴出来.. 第一个资料 Windows/DOS与Unix文件格式是不同的,问题一般就是出在/r/n问题上. 回车(CR)和换行(LF)符都是用来表示 ...
- OC项目集成flutter后,编译卡死
oc项目集成flutter的项目,本来运行的好好的,突然就再Xcode编译就是卡死的情况, 先运行一下flutter的项目,再编译Xcode的项目,就好了
- 【HTML】TinyMCE 编辑器
HTML编辑器 一.页面效果 二.引入JS.CSS <!DOCTYPE html> <html lang="en"> <head> <me ...
- 如何有效检测、识别和管理 Terraform 配置漂移?
作者|Krishnadutt Panchagnula 翻译|Seal软件 链接|https://betterprogramming.pub/detecting-identifying-and-mana ...
- hexo博客主题,git上传,报错Template render error的解决方案
报错信息 INFO Start processing FATAL Something's wrong. Maybe you can find the solution here: http://hex ...
- Win32API中的宽字符
4.1了解什么是Win32API Win32API就是windows操作系统提供给我们的函数(应用程序接口),其主要存放在C:\Windows\System32 (存储的DLL是64位).C:\Win ...
- 【工具】-Reverse-DIE(Detect-It-Easy)
关于 Detect It Easy,或缩写为"DIE"是一个用于确定文件类型的程序.Detect It Easy 是一个多功能的 PE 检测工具,基于 QT 平台编写,主要用于 P ...
- jwt实现token鉴权(nodejs koa)
为什么需要token 在后台管理系统中,我们通常使用cookie-session的方式用于鉴权,jwt实现token鉴权(nodejs koa) 但这种方式存在着以下问题 比如cookie的容量太小. ...