您的位置:首页 > 大数据 > 人工智能

hdu 6058 Kanade's sum(链表)(2017 Multi-University Training Contest - Team 3 )

2017-08-02 12:15 507 查看

Kanade’s sum

题目链接:Kanade’s sum

官方题解:



其实就是一开始先维护一个满的链表,从小到大遍历x,计算完每一个x后,就把它从链表中删掉,这样链表中存储的始终是>=x的数

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

typedef long long LL;
const int maxn=5e5+10;
int pos[maxn],pre[maxn],nxt[maxn],a[maxn],b[maxn];
int n,k;

LL solve(int x)
{
int s1=0,s2=0;
for(int i=x; i&&s1<=k; i=pre[i])
a[++s1]=i-pre[i];//a[]存储的是左边最近的k个>=它的数之间的区间长度(共k个区间)
for(int i=x; i<=n&&s2<=k; i=nxt[i])
b[++s2]=nxt[i]-i;//b[]存储的是右边最近的k个>=它的数之间的区间长度(共k个区间)
LL ans=0;
for(int i=1; i<=s1; ++i)
if(k-i+1<=s2)
ans+=(LL)a[i]*b[k-i+1];
return ans;
}

void del(int x)//删除
{
pre[nxt[x]]=pre[x];
nxt[pre[x]]=nxt[x];
}

int main()
{
int t,x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=1; i<=n; ++i)
{
scanf("%d",&x);
pos[x]=i,pre[i]=i-1,nxt[i]=i+1;
}
LL ans=0;
for(int i=1; i<=n; ++i)
{
ans+=solve(pos[i])*i;
del(pos[i]);
}
printf("%lld\n",ans);
}
return 0;
}


参考博客:

_Kazusa
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐