HDU 5289 Assignment

题意:在n个数中找一共有几个数组,使得数组内的最值差不超过k,数组元素要求连续

解一:ST

#include <string.h>
#include <math.h>
#include <stdio.h>
#define ll __int64
#define MAX(a,b) ((a)<(b)?(b):(a))
#define MIN(a,b) ((a)<(b)?(a):(b))
const int maxn=100005;
ll a[maxn];
int maxx[maxn][20];
int minn[maxn][20];
void rmq(int n)           //子串赋值
{
    int i,j;
    for(i=1;(1<<i)<=n;i++)
        for(j=1;(j+(1<<i)-1)<=n;j++)
        {
            int temp=1<<(i-1);
            maxx[j][i]=MAX(maxx[j][i-1],maxx[j+temp][i-1]);
            minn[j][i]=MIN(minn[j][i-1],minn[j+temp][i-1]);
        }
    return ;
}
int ask(int l,int r)
{
    int temp=int(log(r-l+1)/log(2));
    int ma=MAX(maxx[l][temp],maxx[r-(1<<temp)+1][temp]);
    int mi=MIN(minn[l][temp],minn[r-(1<<temp)+1][temp]);
    return ma-mi;
}
int main()
{
    int t,n,k;
    ll sum;
    //freopen("1002.in","r",stdin);
    //freopen("out.out","w",stdout);
    while(scanf("%d",&t)!=-1)
    {
        while(t--)
        {
            sum=0;
            scanf("%d%d",&n,&k);
            for(int i=1;i<=n;i++)
            {
                scanf("%I64d",&a[i]);
                minn[i][0]=maxx[i][0]=a[i];
            }
            rmq(n);
            for(int i=1;i<=n;i++)
            {
                int fr=i,ed=n;
                while(fr<ed)              //二分查找
                {
                    int temp=(fr+ed)/2;
                    if(ask(i,temp)>=k)
                        ed=temp-1;
                    else
                        fr=temp+1;
                }
                if(ask(i,ed)<k)           //坐标差值就是从i点为起点一共有多少个满足的子串
                    sum+=((ll)(ed-i+1));
                else
                    sum+=((ll)(ed-i));
            }
            printf("%I64d\n",sum);
        }
    }
    return 0;
}

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

时间: 2024-11-08 17:11:53

HDU 5289 Assignment的相关文章

hdu 5289 Assignment 二分+rmq

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 332    Accepted Submission(s): 169 Problem Description Tom owns a company and he is

HDU 5289 Assignment(二分+RMQ-ST)

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

hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数 思路:求出区间的最大最小值,只要他们的差值小于k,那么这个区间就符合要求,但是由于n较大,用暴力一定超时,所以就要用别的方法了:而RMQ是可以求区间的最值的,而且预处理的复杂度只有O(nlogn),而查询只是O(1)处理,这样相对来说节约了时间,再根据右端点来二分枚举左端点(其实不用二分好像更快,估

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

hdu 5289 Assignment 【ST算法】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:求满足最大值减最小值小于k的区间的数目. 枚举左端点,二分右端点,用st算法求区间最值 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #incl

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(多校联合第一场1002)

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

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

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

HDU - 5289 Assignment (RMQ+二分)

题目链接: Assignment  题意: 给出一个数列,问其中存在多少连续子序列,使得子序列的最大值-最小值<k. 题解: RMQ先处理出每个区间的最大值和最小值(复杂度为:n×logn),相当于求出了每个区间的最大值-最小值.那么现在我们枚举左端点,二分右端点就可以在n×logn×logn的时间内过. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX_N = 1e5+9; 4 int vec[MAX_N]