HDU 6058 维护最近k个比本身大的数

来源:互联网 发布:荒潮 知乎 编辑:程序博客网 时间:2024/06/11 10:01
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=5e5+5;int read(){    int ret=0;    char ch=getchar();    while(ch<'0'||ch>'9') ch=getchar();    for(; ch>='0'&&ch<='9'; ch=getchar()) ret=ret*10+ch-'0';    return ret;}int pos[N],nxt[N],pre[N];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n=read(),m=read();        for(int i=1; i<=n; i++)        {            int x=read();            pos[x]=i,pre[i]=i-1,nxt[i]=i+1;        }        pre[0]=0;        nxt[n+1]=n+1;        ll sum=0;        for(int j=1; j<=n; j++)        {            int x=pos[j];            int rq[105];            int lc,rc;            lc=rc=0;            for(int i=x;i<=n&&rc<m;i=nxt[i])                rq[++rc]=nxt[i]-i;            ll ans=0;            for(int i=x; i>0&&lc<m; i=pre[i])            {                lc++;                if(m-lc+1>rc) continue;                else ans+=(i-pre[i])*rq[m-lc+1];            }            sum+=ans*j;            pre[nxt[x]]=pre[x];            nxt[pre[x]]=nxt[x];        }        printf("%I64d\n",sum);    }}
原创粉丝点击