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个订单的信息.然 ...
随机推荐
- SPOJ FAVDICE 数学期望
题目大意: 一个有n面的色子抛掷多少次能使所有面都能被抛到过,求期望值 总面数为n,当已经抛到过 i 个不同面时,我们抛出下一个不同面的概率为 (n-i)/n,那么抛的次数为 n/(n-i) 将所有抛 ...
- 【判连通】HDU 6113 度度熊的01世界
http://acm.hdu.edu.cn/showproblem.php?pid=6113 [题意] 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n ...
- docker改变镜像源
sudo echo “DOCKER_OPTS=\”\$DOCKER_OPTS –registry-mirror=http://your-id.m.daocloud.io -d\”” >> ...
- poj1376 bfs,机器人
开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的BFS即可,但是由于队列没有重判,一直爆队列(MLE!)下次一定要注意! (bfs第一次到达便最优?) #include&l ...
- CodeForces 596C Wilbur and Points
先对n个点分类,然后按题意要求构造,构造的时候判断这个点的右上方之前是否有点,判断可以用线段树来操作. #include<cstdio> #include<cstring> # ...
- 一致性哈希算法-----> 解决memecache 服务器扩容后的数据丢失。
1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...
- D. Spongebob and Squares--cf599D(数学)
http://codeforces.com/problemset/problem/599/D 题目大意:给你一个数k 让你求一个n*m的矩形里面包含k个正方形 输出有几个这样的矩形 分别是什么 ...
- P1003 铺地毯(noip 2011)
洛谷——P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯 ...
- poj——3177Redundant Paths
poj——3177Redundant Paths 洛谷—— P2860 [USACO06JAN]冗余路径Redundant Paths Time Limit: 1000MS Memory ...
- HOST绑定和VIP映射
今天上线需要配置RAL,处理半天,发现是需要HOST和IP分开来配. 比如: curl -H "Host: ktvin.nuomi.com" "http://10.207 ...