首页 > 试题广场 >

牛牛的Link Power I

[编程题]牛牛的Link Power I
  • 热度指数:1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

牛牛有一颗大小为n的神奇Link-Cut 数组,数组上的每一个节点都有两种状态,一种为link状态,另一种为cut状态。数组上任意一对处于link状态的无序点对(即(u,v)和(v,u)被认为是同一对)会产生dis(u,v)的link能量,dis(u,v)为数组上u到v的距离。

我们定义整个数组的Link能量为所有处于link状态的节点产生的link能量之和。

一开始数组上每个节点的状态将由一个长度大小为n的01串给出,'1'表示Link状态,'0'表示Cut状态。

牛牛想要知道整个数组的Link能量,为了避免这个数字过于庞大,你只用输出答案对取余后的结果即可。


输入描述:

第一行输入一个正整数n

接下里一行输入一个长度大小为n的01串表示数组的初始状态,'1'表示Link状态,'0'表示Cut状态。



输出描述:
仅一行,表示整个数组的Link能量对取余后的结果。
示例1

输入

3
101

输出

2
示例2

输入

5
00110

输出

1
示例3

输入

6
000010

输出

0
头像 bnnpuu
发表于 2020-02-08 19:19:09
> 可以分析出第i个'1'可以产生的能量,是i - 1个'1'与前面产生的能量,加上i和i-1的距离乘于前面'1'的个数(因为前面每个'1'与第i个1的距离与第i - 1的距离相比都增加了i和i-1的距离) #include<bits/stdc++.h> using names 展开全文
头像 牛客947274517号
发表于 2020-02-13 23:36:12
  看了题解之后,发现了正统思想应该是利用前缀和进行计算。 其中,sum[i]表示从第1到第i个位置数值为‘1’的坐标和,cnt[i]表示从第1到第i个位置之间‘1’出现的次数,完成对输入的预处理 在计算 “1011” 时,(3-1)+(4-1)=(3+4)- 1 展开全文