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 是一个在值域角度的限制,应考虑采用平衡树或权值...数据结构进行维护. ...
随机推荐
- C语言位运算
C语言位运算详解 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...
- iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装
一个简单的利用UIScrollView 实现的无线滚动banner,下面的代码实现,因为封装问题,对两个及一下的view 支持出了一点问题(view是传参进来的,不可以生成两份),但是原理是正确的,智 ...
- json前后台传值
谈到JSON,简单的说就是一种数据交换格式.近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单.编解码更容易.扩展性更好,所以深受开发人员的喜爱. 下面简单的写一下在项目中前后台js ...
- COJ 0346 WZJ的旅行(二)更新动态树分治版本
WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由 ...
- 【效率】FIND
文档 HTML Flash CSS 字体 命名颜色 工具 IMG
- Qt入门(14)——父窗口部件和子窗口部件
这个例子演示了如何创建一个父窗口部件和子窗口部件.我们下面使用一个单一的父窗口部件和一个独立的子窗口部件编写界面. #include <qvbox.h>我们添加了一个头文件qvbox ...
- 动态规划:NOI2013 快餐店
Description 小 T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近 的地方. 快餐店的顾客分布 ...
- supesite 标签语法
http://blog.sina.com.cn/s/blog_a3c7706701018c8o.html
- 使用Array
public class UsingArray { public static void output(int[]Array) { if(Array!=null) ...
- openStack controller 管理网口TX数据量非常大 网络总是丢包