hdu 5289(单调队列)
Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1673 Accepted Submission(s): 807
First Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
RMQ: 依次回答以i开始的区间中满足最大值与最小值差值不超过k的子区间的个数
单调队列: 依次回答以i结尾的区间中满足最大值与最小值差值不超过k的子区间的个数
所以我们可以用RMQ或者线段树或者树状数组来查询一个子区间的最大值与最小值,然后枚举起点,二分查找满足条件的终点,或者使用线段树来查找
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#define LL long long
#define maxn 110000
using namespace std;
LL k;
int n;
LL a[maxn];
int up[maxn];
int down[maxn];
int Head1,Tail1;
int Head2,Tail2;
int Front;
void solve()
{
LL ans=;
Head1=; Tail1=;
Head2=; Tail2=;
up[Tail1++]=;
down[Tail2++]=;
Front=;
for(int i=;i<n;i++)
{
while(Head1<Tail1 && a[up[Tail1-]]>a[i])
Tail1--;
up[Tail1++]=i; //存入决策,序号
while(Head2<Tail2 && a[down[Tail2-]]<a[i])
Tail2--;
down[Tail2++]=i;
while(a[down[Head2]]-a[up[Head1]]>=k)
{
if(up[Head1]==Front) Head1++; //删掉队首
if(down[Head2]==Front) Head2++;
Front++;
}
ans+=i-Front+;
// printf("%d ",i-Front+1);
}
printf("%lld\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%lld",&n,&k);
for(int i=;i<n;i++)
{
scanf("%lld",&a[i]);
}
solve();
}
return ;
}
由于区间越大,差值越大,所以可以枚举起点,二分查找终点的坐标,ans加上(R-i)+1即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#define LL long long
#define maxn 110000
#include <cstring>
using namespace std;
LL k;
int n;
LL a[maxn];
LL d[maxn][]; //d数组代表最小值,以i开始,长度为2^j
LL D[maxn][]; //d数组代表最大值
void init()
{
memset(d,,sizeof(d));
}
void RMQ_init()
{
for(int j=; (<<j) <=n ;j++) //枚举长度
{
for(int i=;(i+ (<<j))-<n;i++) //(1<<j)为长度
{
d[i][j]= min(d[i][j-],d[i+ (<<(j-)) ][j-]);
D[i][j]= max(D[i][j-],D[i+ (<<(j-))][j-]);
//printf("%d %d %lld %lld\n",i,j,d[i][j],D[i][j]);
// cout<<endl;
}
}
}
LL q(int L,int R)
{
int k=;
while((<<(k+)) <= (R-L+))
k++;
LL Min=min(d[L][k],d[R-(<<k)+][k]);
LL Max=max(D[L][k],D[R-(<<k)+][k]);
return Max-Min;
}
void solve()
{
LL ans=;
for(int i=;i<n;i++)
{
int L=i,R=n-;
while(L<=R) //最终L为第一个不满足的点,由于退出循环是R>L,所以R为最后一个满足的点
{
int Mid=(L+R)>>;
if(q(i,Mid) < k)
{
L=Mid+;
}
else
R=Mid-;
}
ans+=(R-i)+;
// printf("%d %d %d\n",i,R,(R-i)+1);
}
printf("%lld\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%lld",&n,&k);
for(int i=;i<n;i++)
{
scanf("%lld",&a[i]);
d[i][]=a[i];
D[i][]=a[i];
}
RMQ_init();
// printf("%lld %lld %lld %lld\n",d[0][1],D[0][1],q(1,2),q(0,2));
solve();
}
return ;
}
hdu 5289(单调队列)的更多相关文章
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- hdu 3530 单调队列最值
/** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 3415(单调队列) Max Sum of Max-K-sub-sequence
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415 大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列.这个连续子序列的长度小于等于k. ...
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 2191 - 单调队列优化多重背包
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
- HDU 4122 单调队列
转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...
随机推荐
- [NOIP2002] 提高组 洛谷P1031 均分纸牌
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- Python基础教程笔记——第5章:条件,循环和其他语句
5.1 print和import的更多信息 1. print()3.0之后print不再是语句,而是函数, >>> print('udg',12,13) udg 12 13 &g ...
- Python基础教程笔记——第3章:使用字符串
字符串是不可修改的,标准序列操作(索引,分片,判断成员资格,求长度,取最大值 最小值)对字符串都是有效的. 格式化字符串,类似于C语言的输出是的感觉. >>> format=&quo ...
- 2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)
题目 https://nanti.jisuanke.com/t/17118 题意 有n个点0,1,2...n-1,对于一个点对(i,j)满足i<j,那么连一条边,边权为i xor j,求0到n- ...
- JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
- 转:TLV 格式及编解码示例
TLV是一种可变格式,意思就是: Type类型, Lenght长度,Value值: Type和Length的长度固定,一般那是2.4个字节(这里统一采用4个字节): Value的长度有Length指定 ...
- Python开发的一个IDE推荐,Sublime Text 3
Sublime Text 3 官网下载地址为, LINK. 目前最新版本是3114. 这里转载泱泱长空的授权文件(注册码)文章[1],将几个可以用的注册码列举如下: 补充:2016.05 最近经过测试 ...
- cocos2d-x进化为2.5D的一些想法
首先我得说Unity3D已经做的非常好了,搞这些东西意义真心不大.详细Unity3D有什么优势我之前也写过两篇文章来阐述自己的想法. 假设我的下一份工作是U3D的话,预计我就不会 ...
- mysql数据库优化之表的设计和慢查询定位
一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入 ...
- 【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取
在入门系列的教程中.我们经常使用 d3.json() 函数来读取 json 格式的文件.json 格式非常强大.但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 O ...