Assignment

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 148    Accepted Submission(s): 71

Problem Description
Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to some staffs who were in the same group. In a group, 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.
 
Input
In the first line a number T indicates the number of test cases. Then for each case the first line contain 2 numbers n, k (1<=n<=100000, 0<k<=10^9),indicate the company has n persons, k means the maximum difference between abilities 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.
 
Output
For each test,output the number of groups.
 
Sample Input
2
4 2
3 1 2 4
10 5
0 3 4 5 2 1 6 7 8 9
 
Sample Output
5
28

Hint

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)的更多相关文章

  1. HDU 5289 Assignment(2015 多校第一场二分 + RMQ)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  2. HDU 5288 OO&#39;s sequence (2015多校第一场 二分查找)

    OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  3. 2015 多校联赛 ——HDU5371(manacher + 枚举)

    Sample Input 1 10 2 3 4 4 3 2 2 3 4 4   Sample Output Case #1: 9 要求找出一段数字. 将其分成3部分,第①和第②部分成回文字串,第②和第 ...

  4. 2015 多校联赛 ——HDU5334(构造)

    Virtual Participation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  5. 2015 多校联赛 ——HDU5302(构造)

    Connect the Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. 2015 多校联赛 ——HDU5294(最短路,最小切割)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  7. 2015 多校联赛 ——HDU5325(DFS)

    Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Tota ...

  8. 2015 多校联赛 ——HDU5316(线段树)

    Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an ...

  9. 2015 多校联赛 ——HDU5323(搜索)

    Solve this interesting problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

随机推荐

  1. equalsignorecase 和equals的区别

    equals方法来自于Object类equalsIgnoreCase方法来自String类equals对象参数是Object 用于比较两个对象是否相等equals在Object类中方法默然比较对象内存 ...

  2. memmove 和 memcpy的区别以及处理内存重叠问题

    区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const v ...

  3. bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战

    http://www.lydsy.com/JudgeOnline/problem.php?id=2325 设线段树节点区间为[l,r] 每个节点维护sum[0/1][0/1]  从l的A/B区域到r的 ...

  4. 技术文档分享_linux中生成考核用的GPT分区表结构修复

    注:历史版本,后期改用python实现了 实验一: 目的:用于生成大量模拟破坏GPT分区结构案例,并生成唯一方式修复后的评判方法.故障:在一个完整的GPT分区磁盘上,丢失了GPT主分区表,或备份分区表 ...

  5. SpringMVC 无法访问到指定jsp页面可能的原因

    当出现你的程序可以访问到对应的controller层.但是却无法访问对应的jsp文件时.你首先做的不是检查web.xml等配置文件,而是打开的服务器根文件检查对应路径下的文件是否存在.命名是否正确.命 ...

  6. python基础学习篇章一

    一. 对Python的认识 1. Python的标准实现方式是将源代码的语句编译为字节码的形式,之后再将字节码解释出来.由于字节码是一种与平台无关的形式,字节码具有可移植性.但是Python没有将代码 ...

  7. Python内置函数(48)——__import__

    英文文档: __import__(name, globals=None, locals=None, fromlist=(), level=0) This function is invoked by ...

  8. Docker学习笔记 - Docker的基本概念

    一.cs架构 Docker客户端:本地或远程 Docker服务端:守护进程Docker Daemon 二.基本概念 Docker镜像:打包阶段,层叠的只读文件系统,引导->root(ubuntu ...

  9. 新概念英语(1-61)A bad cold

    新概念英语(1-61)A bad cold What is good news for Jimmy? A:Where's Jimmy? B:He's in bed. A:What's the matt ...

  10. HTML-----<a>、<table>、<form>解析

      超链接 anchor 锚 <a href="url">内容</a> Href Hypertext reference 引用 URL(Uniform Re ...