2015 多校联赛 ——HDU5289(二分+ST)
Assignment
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 148 Accepted Submission(s): 71
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]
给n个数的序列,找出其中有多少[i , j] 满足最大值和最小值的差小于k 枚举左端, if(last>0&&abs(num[i-1]-num[last])<k),last记录的是右端最近不满足情况的那个数,假设 i-1到last不满足条件,则说明在i-1<= x <=last-1必定有 num[x] - num[last] >= k. 所以判断第i个数时先判断i-1,num[i-1]-num[last])<k 则说明必定存在i<= x <=last-1不满足条件,则跳过过这次i判断. (感觉这不是什么正常套路) 官方解: 1. 枚举左端,二分右端,ST求最值 2. 用单调队列维护最值 如果没这个判断则超时,数据真大 - - !! <span style="font-size:18px;">#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib> using namespace std; long long num[101000]; long long s(long long i)
{
return (1+i)*i/2;
} int main()
{
int t, n, k, minx, maxx, last;
long long int re;
//freopen("1002.txt","r",stdin);
scanf("%d", &t);
while(t--)
{
re = 0;
scanf("%d%d", &n, &k);
for(int i=1; i<=n; i++)
{
scanf("%I64d", num+i);
}
last = -1;
for(int i=1; i<=n; i++)
{
if(last>0&&abs(num[i-1]-num[last])<k)
{
continue;
}
minx = num[i];
maxx = num[i];
int j;
for(j=i+1; j<=n; j++)
{
if(abs(num[j]-minx)>=k || abs(num[j]-maxx)>=k)
{
break;
}
else
{
if(num[j]<minx) minx = num[j];
if(num[j]>maxx) maxx = num[j];
}
}
if(last<0)
{
re += s(j-i);
last = j;
}
else if(j>last)
{
re += (s(j-i) - s(last-i));
last = j;
}
}
cout<<re<<endl;
}
return 0;
}< RMQ: #include <cstdio>
#include <iostream> using namespace std; int p[200005];
int dp1[200005][30],dp2[200005][30]; void RMQ_init(int n)
{
for(int i=1; i<=n; i++)
{
dp1[i][0]=p[i];
dp2[i][0]=p[i];
}
for(int j=1; (1<<j)<=n; j++)
{
for(int i=1; i+(1<<j)-1<=n; i++)
{
dp1[i][j]=max(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
}
}
} int rmq(int x,int y)
{
int k=0;
while((1<<(k+1))<=y-x+1)k++;
return max(dp1[x][k],dp1[y-(1<<k)+1][k])-min(dp2[x][k],dp2[y-(1<<k)+1][k]);
} int main()
{
int T,n,k;
//freopen("1002.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++)
scanf("%d",&p[i]); long long int num = 0;
RMQ_init(n); int temp = 1;
for(int i = 1; i <= n; i++)
{
while(rmq(temp,i) >= k && temp <i)
temp++;
num += (i-temp+1);
}
printf("%I64d\n",num);
}
return 0;
2015 多校联赛 ——HDU5289(二分+ST)的更多相关文章
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5288 OO's sequence (2015多校第一场 二分查找)
OO's Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2015 多校联赛 ——HDU5371(manacher + 枚举)
Sample Input 1 10 2 3 4 4 3 2 2 3 4 4 Sample Output Case #1: 9 要求找出一段数字. 将其分成3部分,第①和第②部分成回文字串,第②和第 ...
- 2015 多校联赛 ——HDU5334(构造)
Virtual Participation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- 2015 多校联赛 ——HDU5302(构造)
Connect the Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 2015 多校联赛 ——HDU5294(最短路,最小切割)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- 2015 多校联赛 ——HDU5325(DFS)
Crazy Bobo Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Tota ...
- 2015 多校联赛 ——HDU5316(线段树)
Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an ...
- 2015 多校联赛 ——HDU5323(搜索)
Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- APP案例分析
产品 蓝叠安卓模拟器 选择理由 看了一眼桌面,就这个比较有意思.现在很多人喜欢玩手游,经常喜欢开个小号搞事情.这时候身边又没有多余的手机,怎么办?安卓模拟器下一个.手机屏幕太小玩起来没意思怎么 ...
- 软件工程第三次作业-结对作业NO.1
第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...
- C程序设计-----第1次作业
一. PTA作业. 在完成PTA作业的时候我没有认真读题.每次都是提交完整代码 6-1(1) #include <stdio.h> //P++等价于(p)++还是等价于*(p++)? ...
- python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...
- 利用python实现简单邮件功能
#!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.utils import formataddr from ...
- JAVA面向对象的多态性
什么是多态?简而言之就是相同的行为,不同的实现. 而多态也分为静态多态(重载).动态多态(重写)和动态绑定. 静态动态,实际就是指的重载的概念,是系统在编译时,就能知晓该具体调用哪个方法.动态多态指在 ...
- python 鸭子类型
首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型. 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不 ...
- cookie中存中文
cookie中存中文 1:想要在cookie中存中文:需要用到URLEncoder(在jdkAPI中有介绍) Cookie cookie = new Cookie("User",U ...
- SpringCloud的微服务网关:zuul(理论)
参考链接:https://springcloud.cc/spring-cloud-dalston.html 一.概念与定义 1.为什么要引入API网关 后期维护:路由规则和服务实例列表困难 系统架构: ...
- RxJava系列7(最佳实践)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...