YYHS-NOIP2017Training0921-逆光

题目描述

有一束光/那瞬间/是什么痛得刺眼/你的视线是谅解/为什么舍不得熄灭/我逆着光却看见/那是泪光/那力量/我不想再去抵挡/面对希望/逆着光/感觉爱存在的地方/一直就在我身旁

Description

Zyh养着n盆太阳花,它们被排在一列直线上。为了简化问题,太阳花的朝向只有向左和向右这两种。Zyh非常喜欢这些花,于是他在每盆花的上方放置了光源。

太阳花和Zyh幸福地生活着,然而每次要关掉这些光源的时候就会出现一个问题。因为Zyh的动作问题,他每次只能关掉一个光源,在关掉这个光源后,这个光源下方的花就会休眠。然而,对于每一个未休眠的太阳花,如果它的朝向向左,那么每看到一个在它左边的光源关闭,它就会认为自己的人生有些黑暗,于是对Zyh的好感减1。同样地,如果它的朝向向右,那么每看到一个在它右边的光源关闭,也会导致它对Zyh的好感减1。

Zyh不想看到太阳花对他的好感下降太多。于是他想知道关掉所有灯后,太阳花下降的好感总值是多少。

输入

输入包含两行。第一行是一个数正整数n表示太阳花的盆数。然后第二行是n个由空格隔开的0或1。0表示向左,1表示向右。

输出

只有一个数,太阳花下降的好感总值。

样例输入

5 0 0 0 1 0

样例输出

1

提示

Case two

Input

5

1 0 1 0 1

Output

3

Hint

对于30%的数据 n<10

对于70%的数据 n<=5000

对于100%的数据 n<=1000000

题解

这道题0表示朝左,1表示朝右

首先我们考虑0 1的情况,这样下降的好感度是为0的,而1 0是需要下降1好感度的

再来一个样例1 0 0 0,这样需要下降3好感度,相信大家已经想到了一些

通过这几个样例可以发现

关掉1,下降的好感度是它右边的0的个数

关掉0,下降的好感度是它左边的1的个数

所以不管关0还是1,下降的好感度就是逆序对的个数

所以答案就是逆序对个数,因为数为0或1,所以我们可以预处理

sum[i]表示1~i中1的个数,每次判断朝向为0,ans+=sum[i]即可 注意ans要开long long

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define N 1000005
 4 using namespace std;
 5 int n,x;
 6 ll ans;
 7 int sum[N];
 8 int main(){
 9     scanf("%d",&n);
10     for (int i=1;i<=n;i++){
11         scanf("%d",&x);
12         sum[i]=sum[i-1]+x;
13         if (!x) ans+=sum[i];
14     }
15     printf("%lld
",ans);
16     return 0;
17 } 
View Code
原文地址:https://www.cnblogs.com/zhuchenrui/p/7573081.html