hdu 6058 Kanade's sum 枚举

Problem Description
Give you an array A[1..n]of length n.

Let f(l,r,k) be the k-th largest element of A[l..r].

Specially , f(l,r,k)=0 if r−l+1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e5+5;
int l[maxn],r[maxn],cntl,cntr,a[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        ll ans=0;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            cntl=cntr=1;
            int j;
            for(j=i+1;j<=n;j++)
            {
                if(cntr>k)
                    break;
                if(a[j]>a[i])
                    r[cntr++]=j-i;
            }
            if(j>n)
                r[cntr]=n-i+1;
            for(j=i-1;j>=1;j--)
            {
                if(cntl>k)
                    break;
                if(a[j]>a[i])
                    l[cntl++]=i-j;
            }
            if(j<=1)l[cntl]=i;
            for(j=0;j<cntl;j++)
            {
                if(k-j-1>=cntr)
                    continue;
                ll _n=l[j+1]-l[j];
                ll _m=r[k-j]-r[k-j-1];
                ans+=(ll)_n*_m*a[i];
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/82219763