【高手训练】【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出发每次随机选一条 ...
随机推荐
- 行行AI人才直播第9期:销氪副总裁陈摩西《AI在企业服务领域的商业化应用设计思路》
人工智能 (AI) 正在颠覆几乎所有行业,并正在改变我们开展业务的方式.近年来,SaaS 行业一直是受影响最大的行业之一,人工智能在其指数级增长中发挥着至关重要的作用.随着 AI 技术逐渐落地和市场认 ...
- 信奥赛题1001:Hello,World!
这个题实在是太简单的了,无法比喻,直接付代码! //c++ #include<bits/stdc++.h> using namespace std; int main() { cout&l ...
- ubuntu 终端选中黏贴、自带截图
鼠标选中 -- 复制 鼠标中键 -- 粘贴 注意,在tmux中,这个操作需要加上 Shift 键. PrtSc:截图整个桌面保存到Pictures Ctrl + PrtSc:截图整个桌面到剪贴板 Sh ...
- 2021-7-7 Vue实现切换图片功能代码
<!DOCTYPE html> <html> <head> <title> </title> </head> <body& ...
- XCTF-favorite_number
题目 (xctf.org.cn) 判断,既要数组强等于,又要首元素不等:php有下标越界溢出漏洞,因此0可以通过整型溢出得到 绕过if判断 playload:stuff[4294967296]=adm ...
- Git SSH 认证配置
[前言] 我们在开发过程中,经常会和github,gitlab或者gitee打交道,一般临时克隆(clone)其他人的项目学习参考时,我们大多采用 https 的方式进行 clone 但如果在参与多个 ...
- linux系统下python中的tkinter库
打开终端,输入如下命令: sudo apt-get update sudo apt-get install python3-tk
- excel:if语句
IF语法格式: IF(logical_test,value_if_true,value_if_false) 释义:判断一个条件是否满足,如果满足返回一个值,如果不满足则返回另一个值. logical_ ...
- 王道oj/problem17
网址:http:oj.lgwenda.com/problem17 思路:指针其实就是存储地址的一个空间,LinkList=LNode* 代码: #define _CRT_SECURE_NO_WARNI ...
- 绕过PHP执行命令的函数执行系统cmd命令
<?php $evil=`set`; echo '<pre>'.$evil.'</pre>'; ?> 成功执行set命令,你懂的! 顺手写了个php执行cmd命令的 ...