题目描述
有一束光/那瞬间/是什么痛得刺眼/你的视线是谅解/为什么舍不得熄灭/我逆着光却看见/那是泪光/那力量/我不想再去抵挡/面对希望/逆着光/感觉爱存在的地方/一直就在我身旁
Description
Zyh养着n盆太阳花,它们被排在一列直线上。为了简化问题,太阳花的朝向只有向左和向右这两种。Zyh非常喜欢这些花,于是他在每盆花的上方放置了光源。
太阳花和Zyh幸福地生活着,然而每次要关掉这些光源的时候就会出现一个问题。因为Zyh的动作问题,他每次只能关掉一个光源,在关掉这个光源后,这个光源下方的花就会休眠。然而,对于每一个未休眠的太阳花,如果它的朝向向左,那么每看到一个在它左边的光源关闭,它就会认为自己的人生有些黑暗,于是对Zyh的好感减1。同样地,如果它的朝向向右,那么每看到一个在它右边的光源关闭,也会导致它对Zyh的好感减1。
Zyh不想看到太阳花对他的好感下降太多。于是他想知道关掉所有灯后,太阳花下降的好感总值是多少。
输入
输入包含两行。第一行是一个数正整数n表示太阳花的盆数。然后第二行是n个由空格隔开的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 }