HDU 5289 Assignment (ST算法区间最值+二分)
题目链接: pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289
题面:
Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 672 Accepted Submission(s): 335
the difference of the ability of any two staff is less than k, and their numbers are continuous. Tom want to know the number of groups like this.
of staff in a group is less than k. The second line contains n integers:a[1],a[2],…,a[n](0<=a[i]<=10^9),indicate the i-th staff’s ability.
2
4 2
3 1 2 4
10 5
0 3 4 5 2 1 6 7 8 9
5
28HintFirst Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
解题:
比赛的时候,怎么想都想不正确。想去找近期的不合法的点,复杂度太高。
看了题解才知道是用ST算法的。先前不知道,这是一篇非常不错的ST算法的介绍。
http://blog.csdn.net/david_jett/article/details/46990651
枚举左边端点,二分右端点。用ST算法推断该区间是否合法,直至右端点到极限(即二分的左右边界相遇或交叉)。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>
#define mod 1000000007
using namespace std;
int t,n,k;
int a[100100],minn[100010][20],maxn[100010][20],mid;
long long ans;
void Rmq_Init()
{
int m=19;
for(int i=1;i<=n;i++)
maxn[i][0]=minn[i][0]=a[i];
for(int i=1;i<=m;i++)
for(int j=n;j;j--)
{
maxn[j][i]=maxn[j][i-1];
minn[j][i]=minn[j][i-1];
if(j+(1<<(i-1))<=n)
{
maxn[j][i]=max(maxn[j][i],maxn[j+(1<<(i-1))][i-1]);
minn[j][i]=min(minn[j][i],minn[j+(1<<(i-1))][i-1]);
}
}
}
int Query_dif(int l,int r)
{
int m=floor(log((double)(r-l+1))/log(2.0));
int Max=max(maxn[l][m],maxn[r-(1<<m)+1][m]);
int Min=min(minn[l][m],minn[r-(1<<m)+1][m]);
return Max-Min;
}
int solve(int l)
{
int le,ri;
le=l;
ri=n;
while(le<=ri)
{
mid=(le+ri)/2;
if(Query_dif(l,mid)>=k)
{
ri=mid-1;
}
else
{
le=mid+1;
}
}
/*if(Query_dif(l,mid)>=k)
return mid-l;
else
return mid-l+1;*/
return ri-l+1;
}
int main()
{
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
Rmq_Init();
for(int i=1;i<=n;i++)
{
ans=ans+solve(i);
//cout<<i<<" "<<Query_dif(i,n)<<endl;
//cout<<ans<<endl;
}
printf("%lld\n",ans);
}
return 0;
}
HDU 5289 Assignment (ST算法区间最值+二分)的更多相关文章
- hdu 5289 Assignment (ST+二分)
Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...
- RMQ st算法 区间最值模板
#include<bits/stdc++.h> ; ; int f[N][Logn],a[N],lg[N],n,m; int main(){ cin>>n>>m; ...
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- hdu3486 ST表区间最值+二分
还是挺简单的,但是区间处理的时候要注意一下 #include<iostream> #include<cstring> #include<cstdio> #inclu ...
- HDU 5289 Assignment [优先队列 贪心]
HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...
- HDU 5289 Assignment (数字序列,ST算法)
题意: 给一个整数序列,多达10万个,问:有多少个区间满足“区间最大元素与最小元素之差不超过k”.k是给定的. 思路: 如果穷举,有O(n*n)复杂度.可以用ST算法先预处理每个区间最大和最小,O(n ...
- HDU 5289 Assignment (二分+区间最值)
[题目链接]click here~~ [题目大意]: 给出一个数列,问当中存在多少连续子序列,子序列的最大值-最小值<k [思路]:枚举数列左端点.然后二分枚举右端点,用ST算法求区间最值.(或 ...
- HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is ...
- HDU 5289 Assignment(二分+RMQ-ST)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
随机推荐
- Android RecyclerView notifyDataSetChanged不起作用
一般listview设置完data后调用notifyDataSetChanged便可刷新布局界面,然而recycleview调用这个方法却没有任何反应.对于很多不熟悉recycleview的话很容易躺 ...
- [转]深入理解/proc目录
Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...
- node 搭建本地服务器
/** * 代理服务器 natapp -authtoken f1bdaa0535788971 * 热部署指令 supervisor index */ const Koa = require('koa' ...
- 快速学习mybatis框架
一.介绍Mybatis(主要从以下两点进行介绍) 1.MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动 ...
- CNN结构:HSV中的饱和度解析
参考:颜色的前世今生-饱和度 详解,划重点- 关键这个"纯"是指什么? 是指颜色明亮么?明度高的颜色看起来也明亮啊,不一定纯度高啊- 是说颜色鲜艳么?颜色 "不鲜艳&qu ...
- ats 与 https
一些证书相关的描述: https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKe ...
- Sprinboot优雅配置监听,并记录所有启动事件
在阅读Springboot启动源码的时候,发现Springboot自动启动listeners是通过uopeizhi文件配置的,本文就是采用Springboot方式自动装入listeners. 项目依赖 ...
- yagmail邮件模块
昨天接到一个需求,就是要求用邮件发送一html文件.这里我想到了用yagmail #!/usr/bin/env python #-*- coding:utf-8 -*- import yagmail ...
- 小程序map地图多点定位
最近需求有一个类似共享单车查看附近单车的功能,看了看小程序map api对多点定位显示描述的不怎么清晰.显示定位数组添加多个时就不显示了.踩了几个坑写了几个方法.最终弄出来了.有问题建议欢迎留言. h ...
- js的StringBuffer类
function StringBuffer(str){ var arr = []; str = str || ""; arr.push(str); this.append = fu ...