来自学长的快乐AK题——Day2 A

A——蜜汁做法

Description

n个小球排成一列,第i个小球颜色为ai

定义小球i与j的距离为|(i-j)*(ai-aj)|

求所有小球间距离之和

i与j 和 j与i 不必重复计算

100%:n<=1000000,0<=ai<=1

思路

由条件容易得到:只有当ai-aj不为0,即ai和aj不相等时,距离才不为0。也就是说,只有ai与aj不相等的两个小球才能产生贡献。

观察数据范围,很容易发现一个突破口:ai不是0就是1。那么对于一个0色球来说,只有1色球能与它产生贡献,1色球同理。

对于任意一个小球i来说,设它前面有a1个0色球,编号和为a2;有b1个1色球,编号和为b2。

若i为0色球,则前面的1色球对它的贡献为b1*i-b2,为1色球同理。(只需要考虑i之前的小球,因为题目要求无需重复计算i,j和j,i)

代码

(代码与上面的题解除了基本思想外一点关系也没有,属于我比赛时乱搞。。。)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6;
int n,cnt,tot,a[N+1];
long long ans,s[N+1],p[N+1],q[N+1];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(!a[i]) p[++cnt]=i;
		else q[++tot]=i;
	}
	for(int i=1;i<=tot;i++)
	s[i]=s[i-1]+q[i];
	for(int i=1;i<=cnt;i++)
	{
		int k=lower_bound(q+1,q+tot+1,p[i])-q;
		int len=tot-k+1;
		ans+=(s[tot]-s[k-1]-len*p[i])+((k-1)*p[i]-s[k-1]);
	}
	printf("%lld",ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值