hdu5289 Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2555 Accepted Submission(s): 1200
ability of any two staff is less than k, and their numbers are continuous. Tom want to know the number of groups like this.
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.
4 2
3 1 2 4
10 5
0 3 4 5 2 1 6 7 8 9
28
First Sample, the satisfied groups include:[1,1]、[2,2]、[3,3]、[4,4] 、[2,3]
这题有多种做法,但思路差不多,我的做法是依次枚举左端点或者右端点,然后二分查找所能达到的最右边,然后累加起来。
方法一:用树状数组或者rmq枚举左端点,然后二分查找满足条件的最右端点。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 100060
#define ll long long
#define inf 2000000000
int a[maxn],b1[maxn],b2[maxn];/*b1最小值,b2最大值*/
int lowbit(int x){
return x&(-x);
}
void update1(int pos,int num)
{
while(pos<=maxn){
b1[pos]=min(b1[pos],num);pos+=lowbit(pos);
}
}
int question1(int pos)
{
int num=inf;
while(pos>0){
num=min(b1[pos],num);pos-=lowbit(pos);
}
return num;
}
void update2(int pos,int num)
{
while(pos<=maxn){
b2[pos]=max(b2[pos],num);pos+=lowbit(pos);
}
}
int question2(int pos)
{
int num=-1;
while(pos>0){
num=max(b2[pos],num);pos-=lowbit(pos);
}
return num;
}
int main()
{
int n,m,i,j,T,k,l,mid,r;
ll ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
b1[i]=inf;b2[i]=-1;
scanf("%d",&a[i]);
}
ans=0;
for(i=n;i>=1;i--){
update1(i,a[i]);
update2(i,a[i]);
l=i;r=n;
while(l<=r){
mid=(l+r)/2;
if(question2(mid)-question1(mid)>=k){
r=mid-1;
}
else l=mid+1;
}
//printf("%d %d %d\n",i,l,r);
if(r>=i)
ans+=(ll)(r-i+1);
/*printf("%lld\n",ans);*/
}
printf("%lld\n",ans);
}
return 0;
}
代码二:维护两个单调队列,分别维护最大值和最小值,依次枚举右端点,然后找到符合条件的左端点。(这个方法速度是最快的,只需243ms,惊!)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 100060
#define ll long long
int q1[1111111][2],q2[1111111][2];
int a[maxn];
int main()
{
int n,m,i,j,k,front1,front2,rear1,rear2,l,r,T;
ll ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
ans=0;
front1=front2=1;rear1=rear2=0;l=1;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
while(front1<=rear1 && q1[rear1][0]>=a[i]){
rear1--;
}
rear1++;q1[rear1][0]=a[i];q1[rear1][1]=i;
while(front2<=rear2 && q2[rear2][0]<=a[i]){
rear2--;
}
rear2++;q2[rear2][0]=a[i];q2[rear2][1]=i;
while(front1<=rear1 && front2<=rear2 && q2[front2][0]-q1[front1][0]>=k){
l=min(q2[front2][1],q1[front1][1])+1;
if(q2[front2][1]<q1[front1][1]){
front2++;
}
else if(q2[front2][1]>q1[front1][1]){
front1++;
}
else{
front1++;front2++;
}
}
ans+=i-l+1;
/*printf("%d %d %lld\n",i,l,ans);*/
}
printf("%lld\n",ans);
}
return 0;
}
hdu5289 Assignment的更多相关文章
- 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 2015多校联合第一场1002 Assignment
题意:给出一个数列.问当中存在多少连续子区间,当中子区间的(最大值-最小值)<k 思路:设dp[i]为从区间1到i满足题意条件的解.终于解即为dp[n]. 此外 如果对于arr[i] 往左遍历 ...
- 【HDU5289】Assignment
题目大意:给定一个长度为 N 的序列,求序列中最大值和最小值相差小于 K 的连续段的个数. 题解: 最大值和最小值相差不超过 K 是一个在值域角度的限制,应考虑采用平衡树或权值...数据结构进行维护. ...
- Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式”
Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为"通用职责分配软件模式" 1. GRA ...
- user initialization list vs constructor assignment
[本文连接] http://www.cnblogs.com/hellogiser/p/user_initialization_list.html [分析] 初始化列表和构造函数内的赋值语句有何区别? ...
- Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removing it
Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removi ...
- 代写assignment
集英服务社,强于形,慧于心 集英服务社,是一家致力于优质学业设计的服务机构,为大家提供优质原创的学业解决方案.多年来,为海内外学子提供了多份原创优质的学业设计解决方案. 集英服务社,代写essay/a ...
- [Top-Down Approach] Assignment 1: WebServer [Python]
Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...
随机推荐
- docker 报错: Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
最近在 Windows 子系统 WSL 上面安装了一个 ubuntu18.04, 安装完docker 跑 hello-world 的时候报错了 docker: Cannot connect to th ...
- linux之平均负载(学习笔记非原创)
什么是平均负载 [root@111 ~]# uptime 11:03:33 up 149 days, 17:34, 1 user, load average: 0.08, 0.05, 0.01 最后三 ...
- java 记录数据持续变化时间
1.需求:获取count为null和不为null的持续变化 [{count=0, time=0}, {count=10, time=1000}, {count=20, time=2000}, {cou ...
- 被集群节点负载不均所困扰?TKE 重磅推出全链路调度解决方案
引言 在 K8s 集群运营过程中,常常会被节点 CPU 和内存的高使用率所困扰,既影响了节点上 Pod 的稳定运行,也会增加节点故障的几率.为了应对集群节点高负载的问题,平衡各个节点之间的资源使用率, ...
- 2.4V升5V芯片,8uA功耗,低功耗升压电路图
2.4V升5V,可用于USB拔插充电,也可以用于把两节镍氢电池2.4V升压到5V,的固定输出稳压电压值,同时输出电流可达1A,0.5A等 首先是先说下0.5A的这款的话,是比较低功耗的,8uA左右的输 ...
- Flask的“中间件”
特殊装饰器 from flask import Flask,render_template,request app = Flask(__name__) @app.before_request def ...
- uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息
Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取.因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许. 读写手机存储权 ...
- CSS实现迷你键盘
最近做了一个迷你键盘的dome,这里分享给大家 dome下载地址(点击下载) 代码如下: <!DOCTYPE html> <html lang="en" > ...
- JavaScript中函数的调用!
JavaScript中函数的调用! 1 普通函数 // 1 普通函数 function fn() { console.log(123); } // 函数名 + 一个小括号! 或者 函数名.call() ...
- windows2012-2016亲测安装mysql8.0
先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 不要手动创建Data文件夹和my.ini文件, cmd命令窗口进入bin目录,如果已经做了环境变量那随意在哪里打开. mysqld ...