【单调队列+尺取】HDU 3530 Subsequence
acm.hdu.edu.cn/showproblem.php?pid=3530
【题意】
- 给定一个长度为n的序列,问这个序列满足最大值和最小值的差在[m,k]的范围内的最长子区间是多长?
【思路】
- 对于序列中特定的位置j,我们固定右端j考察左端i,发现[i,j]内的最大值随i的增大而非严格递减
- 对于序列中特定的位置j,我们固定右端j考察左端i,发现[i,j]内的最小值随i的增大而非严格递增
- 所以[i,j]内最大值与最小值的差随i的增大而递减
- 对于序列中特定的位置i,我们固定左端i考察右端j,发现[i,j]内的最大值随j的增大而非严格递增
- 对于序列中特定的位置i,我们固定左端i考察右端j,发现[i,j]内的最小值随j的增大而非严格递减
- 所以[i,j]内最大值与最小值的差随i的增大而递增
- 所以我们可以尺取,即如位置j对应的左端为l,那么i+1的从l以后找
- 两个单调队列mx和mn分别维护最大值和最小值
- mx中存放的是a中数的下标(单调递增),对应的a中的数是单调递减
- mn中存放的是a中数的下标(单调递增),对应的a中的数是单调递增
- 当a[mx[lx]]-a[mn[ln]]>k时,出队列的是mx[lx]和mn[ln]较小的一个,这样才能保证最长子区间
- 当a[mx[lx]]-a[mn[ln]]<m时,不需做任何操作,因为差是随左端点的增大而递减的,如果a[mx[lx]]-a[mn[ln]]<m,只能不更新ans
【AC】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
const int maxn=1e5+;
int a[maxn];
int mx[maxn],lx,rx;
int mn[maxn],ln,rn;
int l,ans;
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=;i<=n;i++) scanf("%d",&a[i]);
lx=ln=;rx=rn=;l=;
ans=;
for(int i=;i<=n;i++)
{
while(lx<=rx&&a[mx[rx]]<=a[i]) rx--;
mx[++rx]=i;
while(ln<=rn&&a[mn[rn]]>=a[i]) rn--;
mn[++rn]=i;
while(lx<=rx&&ln<=rn&&a[mx[lx]]-a[mn[ln]]>k)
{
if(mx[lx]>=mn[ln])
{
l=mn[ln];
ln++;
}
else
{
l=mx[lx];
lx++;
}
}
if(a[mx[lx]]-a[mn[ln]]>=m)
ans=max(ans,i-l);
}
printf("%d\n",ans);
}
return ;
}
单调队列+尺取
【疑问】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
const int maxn=1e5+;
int a[maxn];
int mx[maxn];
int mn[maxn];
struct node
{
int x;
int pos;
}q[maxn];
bool judge(int mid)
{
memset(q,,sizeof(q));
memset(mx,,sizeof(mx));
memset(mn,,sizeof(mn));
int head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x<a[i]) tail--;
q[++tail].x=a[i];q[tail].pos=i;
while(q[head].pos<=i-mid) head++;
if(i>=mid) mx[i]=q[head].x;
} head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x>a[i]) tail--;
q[++tail].x=a[i];q[tail].pos=i;
while(q[head].pos<=i-mid) head++;
if(i>=mid) mn[i]=q[head].x;
}
for(int i=mid;i<=n;i++)
{
if(mx[i]-mn[i]>=m&&mx[i]-mn[i]<=k)
{
return true;
}
}
return false;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
int l=,r=n;
while(l<=r)
{
int mid=(l+r)>>;
if(judge(mid))
{
l=mid+;
}
else
{
r=mid-;
}
}
printf("%d\n",l-);
}
return ;
}
WA
不知道这个二分答案,然后用单调队列判断可行性为啥是挂的orz,我感觉没错.....希望哪位仁兄看到了帮忙指点一下,小弟不尽感激~
【单调队列+尺取】HDU 3530 Subsequence的更多相关文章
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- HDU 3530 Subsequence(单调队列)
传送门 Description There is a sequence of integers. Your task is to find the longest subsequence that s ...
- HDU - 3530 Subsequence (单调队列)
Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 3530 Subsequence
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3530 Subsequence Description There is a sequence of i ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- hdu 3530 Subsequence 单调队列
题目链接 题目给出n个数, 一个下界m, 一个上界k, 让你求出最长的一段序列, 满足这段序列中的最大的数-最小的数<=k&&>=m, 输出这段长度. 可以维护两个队列, ...
- hdu 3530 "Subsequence" (单调队列)
传送门 题意: 给出一个序列,求最长的连续子序列,使得 m ≤ Max-Min ≤ k 我的理解: 定义数组 a[] 存储输入的 n 个数: 定义两个双端队列: deque<int >qM ...
- [USACO13JAN] Cow Lineup (单调队列,尺取法)
题目链接 Solution 尺取法板子,算是复习一波. 题中说最多删除 \(k\) 种,那么其实就是找一个颜色种类最多为 \(k+1\) 的区间; 统计一下其中最多的颜色出现次数. 然后直接尺取法,然 ...
- ACM-ICPC2018北京网络赛 80 Days(双端队列+尺取)
题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...
随机推荐
- bat 符号说明
netstat -an|findstr 139 ipconfig/all findstr IP ipconfig/all |findstr 物理地址 定值选行 ipconf ...
- SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
今天的文章来自Jerry的同事,曾经的搭档郑晓霞(Zheng Kate).郑晓霞是在Jerry心中是一位很有实力的程序媛,2011年从西安某软件公司跳槽到SAP成都研究院.当时,成都研究院的CRM团队 ...
- int型除以int型
int型除以int型得到的还是int型 就算你是这样的:float a = 5/3,虽然你定义的a是float型,但a得到的结果依旧是1.0000而不是1.66666 5/3先得到1,然后再转换成1. ...
- soapui测试https双向验证p12项目
1.准备好p12 和jsk秘钥文件 2.配置soapui ssl 其中: 1:jks就是放在trustStore那里,密码填写为 106075 2:p12放到keystore,密码填写:180000 ...
- viewDidLoad、loadView
一.loadView永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数,且 ...
- uilabel自动换行
NSString *str = @"我是一asdf我是一我是一我是一我是一我是一我是一我是一我是一我是一我是一我是一asdf我是一asdf我是一asdf我是一asdf我是一asdf我是一as ...
- c# DateTime常用用法
参考:http://sqlyuju.com/c-datetime-hh-hh-qubie.html https://www.cnblogs.com/xiongxiaobai/p/5282827.htm ...
- history.pushState 实现浏览器页面不刷新修改url链接
最近遇到了在不刷新页面的情况下修改浏览器url链接的需求,遂求助于万能的度娘,最终通过history.pushState()完美解决问题.现在将我理解的一些内容分享一下,不对的地方欢迎大家指出. 在使 ...
- javascript基础知识 (八) BOM学习笔记
一.什么是BOM BOM(Browser Object Model)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管理窗口 ...
- Pycharm快捷键及Python常用转义符
不管是windows.xshell或者pycharm,学会使用快捷键都会使学习工作达到事半功倍的效果.这篇博客收集了部分常用的pycharm快捷键,分享给大家,希望对大家有用. 1. 常用快捷键 Py ...