hdu5289||2015多校聯合第一場1002貪心+RMQ
http://acm.hdu.edu.cn/showproblem.php?pid=5289
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]
Source
/**
hdu5289||2015多校聯合第一場1002貪心+RMQ
題目大意:找出連續子區間,其最大最小值只差小於k
解題思路:用rmq維護區間最大最小值只差,貪心掃一遍即可,複雜度O(nlogn)
*/
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
const int N=200005;
int a[N],n,m;
int dp1[N][30];
int dp2[N][30];
void RMQ_init(int n)
{
for(int i=1;i<=n;i++)
{
dp1[i][0]=a[i];
dp2[i][0]=a[i];
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)///白書上的模板,次行稍作改動,否則dp陣列要擴大一倍防止RE
{
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;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
RMQ_init(n);
int k=1;
long long sum=0;
for(int i=1;i<=n;i++)
{
while(rmq(k,i)>=m&&k<i)k++;
sum+=(i-k+1);
// printf("dis i k i-k+1:%d %d %d %d\n",rmq(k,i),i,k,i-k+1);
}
printf("%I64d\n",sum);
}
return 0;
}
相關文章
- HDU 5389 Zero Escape(2015年多校聯合第八場 動態規劃)動態規劃
- HDU 5375 Gray code(2015年多校聯合 動態規劃)動態規劃
- hdu5336 多校聯合第四場1010 模擬+bfs優先佇列佇列
- 2014多校聯合第9場1011題||hdu 4970 樹狀陣列陣列
- 貪心模式記錄模式
- 貪心演算法演算法
- 2014多校聯合第十場A題||hdu 4971 最小割定理在最大權閉合圖上的應用
- 2014多校聯合第9場1006||hdu 4965 矩陣乘法和快速冪矩陣
- RMQ_第一彈_Sparse TableMQ
- Least Cost Bracket Sequence(貪心)ASTRacket
- 牛客 tokitsukaze and Soldier 貪心
- HDU 4550卡片遊戲(貪心)遊戲
- 24/03/20 貪心(一)
- 陳老師的多校聯合 D題 字串處理起來挺麻煩字串
- 學一下貪心演算法-學一下貪心演算法演算法
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- HDU 5813 Elegant Construction (貪心)Struct
- 淺談貪心與動歸
- 貪心演算法Dijkstra演算法
- 貪心(入門簡單題)
- 【例題】【連結串列】NKOJ3499【2015多校聯訓6】密碼密碼
- 程式猿生存指南-63 貪心姑娘
- 演算法基礎–貪心策略演算法
- Moving Tables(貪心演算法)演算法
- 1413D. Shurikens(貪心,棧)3D
- Leetcode 貪心:差值調整LeetCode
- Python演算法:貪心策略Python演算法
- 靈茶之貪心模擬01
- 貪心演算法——換酒問題演算法
- openjudge8469特殊密碼鎖[貪心]密碼
- 【貪心】codeforces 825D Suitable ReplacementUI
- hdu4268 multiset應用 貪心
- hdu5380 貪心+雙端佇列佇列
- 【力扣】最大子陣列和(貪心)力扣陣列
- YT04-貪心課後練習-1002—Repair the Wall-(6.14日-煙臺大學ACM預備隊解題報告)AIACM
- 實現Nest中引數的聯合型別校驗型別
- RMQMQ
- codeforces 1428E. Carrots for Rabbits(貪心(非常優秀的貪心題),結構體過載運算子)結構體