HDU5289
题意:求解存在最大差值小于给定K值的所有区间段。
输入:
T(测试数据)
n(数组个数)K(给定区间值的范围)
ai...(数组值)
输出:
ss(所有满足符合条件的区间段)
思路:二分+ST算法,首先利用ST算法初始化数组,找出区间段最大与最小值,然后直接二分查询数组,并判断给定区间最值是否满
足小于K的情况,所以在遍历完一次数组后,可以累加得到符合条件的所有区间和。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 100100; int i,j,n;
int MIN[MAXN][20],MAX[MAXN][20];
int a[MAXN]; void build()//ST构造区间数组最值
{
for(i=1; i<=n; i++)
MIN[i][0]=MAX[i][0]=a[i]; for(i=1; (1<<i)<=n; i++) //按区间长度递增顺序递推
{
int k = i-1;
for(j=1; j+(1<<i)-1<=n; j++) //区间起点
{
MIN[j][i]=min(MIN[j][k],MIN[j+(1<<k)][k]);
MAX[j][i]=max(MAX[j][k],MAX[j+(1<<k)][k]);
}
}
}
int main()
{
int T,left,right;
scanf("%d",&T);
while(T--)
{
int k;
scanf("%d%d",&n,&k);
long long ss = 0;
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
build(); //初始化
int flag = 1;
for(i=1; i<=n; i++) //遍历
{
left=flag;
right=i;
while(left<=right) //二分寻找符合条件的右端点
{
int mid=(left+right)/2;
int x=(int)(log(double(i-mid+1))/log((double)2));
int MAXX = max(MAX[mid][x],MAX[i-(1<<x)+1][x]);
int MINN = min(MIN[mid][x],MIN[i-(1<<x)+1][x]);
if(MAXX-MINN>=k)
left=mid+1;
else
right=mid-1;
}
flag = left;
ss+=i-left;
} printf("%lld\n",ss+n);
}
return 0;
}
HDU5289的更多相关文章
- ST表入门学习poj3264 hdu5443 hdu5289 codeforces round #361 div2D
ST算法介绍:[转自http://blog.csdn.net/insistgogo/article/details/9929103] 作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 方 ...
- HDU-5289<two pointers>
题意: 求一个数列中存在多少个区间,每个区间内的数的差不超过k; 思路:two_pointers; #include<iostream> #include<cstdio> #i ...
- 2015 多校联赛 ——HDU5289(二分+ST)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- hdu5289 ST表+二分
用裸的St表+暴力枚举查询时稳TLE的,可以枚举每个区间的起点+二分满足条件的区间右端,这样复杂度是O(nlogn) #include<iostream> #include<cstr ...
- hdu5289 单调队列
这题说的是给了 n个数 然后让你计算出所有区间中那些数的最大值减最小值小于k这样的区间有多少个 /* 这样我们给我们在处理过程中的区间做一些处理 我们在处理即将进来的数的时候我们并不知道他是不是我们区 ...
- hdu5289 2015多校联合第一场1002 Assignment
题意:给出一个数列.问当中存在多少连续子区间,当中子区间的(最大值-最小值)<k 思路:设dp[i]为从区间1到i满足题意条件的解.终于解即为dp[n]. 此外 如果对于arr[i] 往左遍历 ...
- hdu5289 Assignment (区间查询最大值最小值,st算法...)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给定长度为n的序列a和一个整数K,找出最大值和最小值的差值小于K的区间.输出满足条件的区间的个 ...
- hdu5289(2015多校1)--Assignment(单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 【HDU5289】Assignment
题目大意:给定一个长度为 N 的序列,求序列中最大值和最小值相差小于 K 的连续段的个数. 题解: 最大值和最小值相差不超过 K 是一个在值域角度的限制,应考虑采用平衡树或权值...数据结构进行维护. ...
随机推荐
- 十月例题F题 - City Game
F - City Game Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Bob is a st ...
- Jenkins 快速搭建持续集成环境
持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...
- struts2+jquery+json集成
以下采用struts2+jquery+json模拟一个案例.当点击提交按钮时会把输入的数据提交到后台,然后从后台获取数据在客户端显示. 效果如下: 接下来为struts2+jquery+json集成步 ...
- C#验证码使用
1.C#创建验证码 1.1 创建获取验证码页面(ValidateCode.aspx) <html xmlns="http://www.w3.org/1999/xhtml"&g ...
- Data 语义学(1)
一.Data Member 的绑定(The binding of Data Member) extern float x; class Point3d { public: Point3d( float ...
- 数学(FFT):BZOJ 3527 [Zjoi2014]力
题目在这里:http://wenku.baidu.com/link?url=X4j8NM14MMYo8Q7uPE7-7GjO2_TXnMFA2azEbBh4pDf7HCENM3-hPEl4mzoe2w ...
- FusionCharts(v3.6.0)使用(1)
前段时间做一个统计系统,需要画各种图表,于是找到了FusionCharts这个插件,功能甚是强大.在这个闲暇的春日午后,将这个插件的快速使用的方法写下来,方便懒得去官网看英文的朋友参考 安装 Fusi ...
- pgAdminIII使用图解
原文地址:http://www.2cto.com/database/201312/267218.html pgAdmin III简介 要打开一个到服务的连接,在树中选择所需的服务,并双击它,或使用“工 ...
- 《JavaScript语言精髓与编程实践》读书笔记一
受到狗哥书单的影响,看到了豆瓣上的评论,买了这本书,然后囫囵吞枣似地用一个月的时间看完了.回头想想自己做的js项目,感觉都羞愧-什么东西都是拿来尝试了一下就用了,其实有很多写得超级丑的地方,看完这个让 ...
- Jenkins 八: 构建Git项目
1. 安装git. http://git-scm.com/download/win 下载之后一步步安装即可. 2. 安装插件. 打开"系统管理" –> "管理插 ...