hdu 6058

来源:互联网 发布:淘宝虚拟变实物 编辑:程序博客网 时间:2024/06/11 21:51
#include<cstdio>#include<cstring>using namespace std;int pre[500010],next[500010],pos[500010],n,k;long long l[50010],r[500010];void init(){for(int i=1;i<=n;i++){int t;scanf("%d",&t);pos[t]=i;}for(int i=0;i<=n+1;i++){pre[i]=i-1;next[i]=i+1;}pre[0]=0,pre[n+1]=n+1;}long long cal(int x){int num1=0,num2=0;for(int i=x;i&&num1<=k;i=pre[i])l[++num1]=i-pre[i];for(int i=x;i<=n&&num2<=k;i=next[i])r[++num2]=next[i]-i;long long ans=0;for(int i=1;i<=num1;i++){if(k-i+1<=num2&&k-i+1>=1)ans+=l[i]*r[k-i+1];}return ans;}void del(int x){pre[next[x]]=pre[x];next[pre[x]]=next[x];}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);init();long long res=0;for(int i=1;i<=n;i++){res+=cal(pos[i])*i;del(pos[i]);}printf("%lld\n",res);}}

原创粉丝点击