Kanade’s sum
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1778 Accepted Submission(s): 722
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<cstdio>
const int MAX = 5e5 + 10;
typedef long long LL;
int N,k,a[MAX],p[MAX],n[MAX],l[82],r[82];
LL sl(int x){
int nl = 0,nr = 0;
for(int i = x; i && nl < k; i = p[i]) l[++nl] = i - p[i]; // 第 nl - 1 比查找的数大的数 ~ 第 nl 比查找的数大的数的区间里的数的个数
for(int i = x; i <= N && nr < k; i = n[i]) r[++nr] = n[i] - i;
LL sum = 0;
for(int i = 1; i <= nl; i++)
if(k - i + 1 <= nr)
sum += (LL) l[i] * r[k - i + 1];
return sum;
}
int main()
{
int T,b;
scanf("%d",&T);
while(T--){
scanf("%d %d",&N,&k);
for(int i = 1; i <= N; i++)
scanf("%d",&b),a[b] = i;
for(int i = 1; i <= N; i++) p[i] = i - 1,n[i] = i + 1;
LL ans = 0;
for(int i = 1; i <= N; i++){
ans += (LL)sl(a[i]) * i;
p[n[a[i]]] = p[a[i]],n[p[a[i]]] = n[a[i]]; // 删除
}
printf("%lld\n",ans);
}
return 0;
}