HDOJ 5289 Assignment 单调队列

维护一个递增的和递减的单调队列

Assignment

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

Total Submission(s): 78    Accepted Submission(s): 40

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

2015 Multi-University Training Contest 1

Recommend

We have carefully selected several similar problems for you:  5299 5298 5297 5296 5295

/* ***********************************************
Author        :CKboss
Created Time  :2015年07月21日 星期二 12时36分35秒
File Name     :1002.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

typedef long long int LL;
const int maxn=100100;

struct Node
{
    int val,pos;
};

int n,K;
int a[maxn];
// q1 dizheng q2 dijian
deque<Node> q1,q2;

LL ans;

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

    int T_T;
    scanf("%d",&T_T);
    while(T_T--)
    {
        ans=0;
        while(!q1.empty()) q1.pop_back();
        while(!q2.empty()) q2.pop_back();

        scanf("%d%d",&n,&K);
        for(int i=0;i<n;i++) scanf("%d",a+i);

        int head=0;
        for(int i=0;i<n;i++)
        {
            Node node = (Node){a[i],i};

            /// push q1 tail dizheng
            while(!q1.empty())
            {
                Node b = q1.back();
                if(b.val<node.val) q1.pop_back();
                else break;
            }
            q1.push_back(node);

            /// push q2 tail dijian
            while(!q2.empty())
            {
                Node b = q2.back();
                if(b.val>node.val) q2.pop_back();
                else break;
            }
            q2.push_back(node);

            if(i==0) ans++;
            else
            {
                /// bijiao head
                while(true)
                {
                    Node big = q1.front();
                    Node small = q2.front();

                    if(big.val-small.val<K) break;
                    else
                    {
                        if(small.pos<big.pos)
                        {
                            head=small.pos+1; q2.pop_front();
                        }
                        else
                        {
                            head=big.pos+1; q1.pop_front();
                        }
                    }
                }
                ans+=i-head+1;
            }
        }

        cout<<ans<<endl;
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 00:55:47

HDOJ 5289 Assignment 单调队列的相关文章

HDU 5289 Assignment(单调队列)

Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 297    Accepted Submission(s): 152 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro

HDU 5289 Assignment(多校2015 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 tas

HDU 5289 Assignment(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 tas

[多校2015.01.1002 单调队列] hdu 5289 Assignment

题意: 给你n个人和一个k 问你把这n个人分成多少个连续的子区间,要求区间每个数两两相差绝对值小于k 思路: 我们仅仅只需要对于当前位置,最左边那个和它绝对值相差大于等于k 的位置在哪 假设对于i这个位置,最左边的位置是tep,不存在的话tep=0 那么当且位置的贡献就是 sum[i]=min(i-tep,sum[i-1]+1); 那么对于这个位置怎么求的话,我是使用了两个单调队列 第一次维护递增的,第二次维护递减的. 每次先把不满足的点全部出队,然后记录最大的下标 然后入队 代码: #incl

hdu5289(2015多校1)--Assignment(单调队列)

Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 503    Accepted Submission(s): 256 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fr

HDU 5089 Assignment(rmq+二分 或 单调队列)

Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 557    Accepted Submission(s): 280 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fr

HDOJ 3415 Max Sum of Max-K-sub-sequence(单调队列)

因为是circle sequence,可以在序列最后+序列前n项(或前k项);利用前缀和思想,预处理出前i个数的和为sum[i],则i~j的和就为sum[j]-sum[i-1],对于每个j,取最小的sum[i-1],这就转成一道单调队列了,维护k个数的最小值. ---------------------------------------------------------------------------------- #include<cstdio> #include<deque&

HDOJ 题目5289 Assignment(RMQ,技巧)

Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1870    Accepted Submission(s): 916 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered f

hdu 5289 单调队列

#include <iostream> #include <cstdio> #include <queue> #include <deque> using namespace std; typedef pair<int, int> P; #define maxn 100000 + 10 deque<long long> Q1; //up deque<long long> Q2; //down int n, k; long