题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058
思路:记录每个点的前面的(k-1)个比它大的值和后面(k-1)个比它大的数,然后枚举每一种情况求和。开两个数组分别记录每相邻两个比它大的数之间的间隔。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[500005];
int la[85],ra[85];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
ll ans=0;
for(int i=0;i<n;i++)
{
int t2=1,t3=1;
int j;
int tr=i,tl=i;
for(j=i-1;j>=0&&t2<=k;j--)
{
if(a[j]>a[i])
{
la[t2++]=tl-j;
tl=j;
}
}
if(j<=0)
{
la[t2]=tl+1;
}
for(j=i+1;j<=n&&t3<=k;j++)
{
if(a[j]>a[i])
{
ra[t3++]=j-tr;
tr=j;
}
}
if(j>=n)
ra[t3]=n-tr;
for(j=0;j<t2;j++)
{
if(k-j-1>=t3)
continue;
ans=ans+(ll)(la[j+1])*(ra[k-j])*a[i];
}
}
cout<<ans<<endl;
}
return 0;
}
/*
1
5 2
1 2 3 4 5
*/
我一定可以的!!!