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个订单的信息.然 ...
随机推荐
- 洛谷P2870 - [USACO07DEC]最佳牛线Best Cow Line
Portal Description 给出一个字符串\(s(|s|\leq3\times10^4)\),每次从\(s\)的开头或结尾取出一个字符接在新字符串\(s'\)的末尾.求字典序最小的\(s'\ ...
- 希尔排序(shell)
希尔排序: 思路: 希尔排序是插入排序的一种改进的版本. 先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序. 这里增量序 ...
- poj2689素数问题
打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单 的素数应用罢了.题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的), 算法:数在int范围内 ...
- POJ 1015 Jury Compromise【DP】
罗大神说这题很简单,,,,然而我着实写的很难过... 题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#proble ...
- 2017多校Round4(hdu6067~hdu6079)
补题进度:10/13 1001 待填坑 1002(kmp+递推) 题意: 有长度为n(<=50000)的字符串S和长度为m(m<=100)的字符串T,有k(k<=50000)组询问, ...
- Client使用c#和odp.net连接server oracle
http://blog.csdn.net/educast/article/details/6605655 Oracle.DataAccess.dll有2.X版本和4.X版本,VS2008开发用2.X ...
- Android Activity与远程Service的通信学习总结
当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意 ...
- java克隆对象clone()的使用方法和作用
转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...
- POJ1195 Mobile phones 【二维树状数组】
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14288 Accepted: 6642 De ...
- 说说Windows7 64bits下安装TensorFlow GPU版本会遇到的一些坑
不多说,直接上干货! 再写博文,回顾在Windows7上安装TensorFlow-GPU的一路坑 Windows7上安装TensorFlow的GPU版本后记 欢迎大家,加入我的微信公众号:大数据躺过的 ...