[贪心]cf225cMilking cows

来源:互联网 发布:网络配音圈子 编辑:程序博客网 时间:2024/06/17 03:28
C. Milking cows
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Iahub helps his grandfather at the farm. Today he must milk the cows. There aren cows sitting in a row, numbered from 1 to n from left to right. Each cow is either facing to the left or facing to the right. When Iahub milks a cow, all the cows that see the current cow get scared and lose one unit of the quantity of milk that they can give. A cow facing left sees all the cows with lower indices than her index, and a cow facing right sees all the cows with higher indices than her index. A cow that got scared once can get scared again (and lose one more unit of milk). A cow that has been milked once cannot get scared and lose any more milk. You can assume that a cow never loses all the milk she can give (a cow gives an infinitely amount of milk).

Iahub can decide the order in which he milks the cows. But he must milk each cow exactly once. Iahub wants to lose as little milk as possible. Print the minimum amount of milk that is lost.

Input

The first line contains an integer n (1 ≤ n ≤ 200000). The second line contains n integers a1,a2, ..., an, where ai is 0 if the cow number i is facing left, and1 if it is facing right.

Output

Print a single integer, the minimum amount of lost milk.

Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use thecin, cout streams or the%I64d specifier.

Sample test(s)
Input
40 0 1 0
Output
1
Input
51 0 1 0 1
Output
3
Note

In the first sample Iahub milks the cows in the following order: cow 3, cow 4, cow 2, cow1. When he milks cow 3, cow4 loses 1 unit of milk. After that, no more milk is lost.


我们把能看见牛i的牛的集合分为两部分:Si表示和i朝同一个方向(即在i的背后),Di表示和i朝相反方向(即与i面对)。存在下面两个事实:

i贡献的值vi>=|Si|。因为S中的牛看见i死,和i看见S的一个子集中的牛死的次数之和等于n。另外i还可能被D中的牛看到,这部分不确定。

i贡献的值vi可以取到n,即S中的牛全死了,然后i背后的牛全死了,然后i死了,然后i面前剩余的牛死了。

同理D中的所有牛都是最优的,因为他们贡献的值vi都等于最小值|Si|。

根据以上证明,我们一定可以选择一个最右边的1,或者最左边的0,将其作为i。因此最优值为∑|S|


#include <cstdio>#include <iostream>using namespace std;typedef long long ll;int main(){//freopen("c.in","r",stdin);//freopen("c.out","w",stdout);int n;cin >> n;ll ans =0;ll t = 0;while (n--){int i;cin >> i;if (i) t++;else ans += t;}cout << ans;}


0 0
原创粉丝点击