#567. 二进制反转

二进制反转

问题描述

在一个数字竞技场中,参赛者们使用二进制数组作为他们的战斗阵型。每个参赛者的阵型由 0011 组成,00 代表防御,11 代表攻击。为了在比赛中获得优势,参赛者们可以选择翻转阵型中的一个元素,以改变其战斗策略。翻转一个元素可以让他们在攻击和防御之间进行灵活调整,即让 00111100

参赛者们希望知道,在执行最多一次翻转操作后,他们的阵型可以产生的最大逆序对数量。逆序对的数量代表了他们阵型的混乱程度,混乱程度越高,意味着他们的战斗策略越难以预测,从而可能获得更大的胜利机会。

  • 二进制数组是仅包含 0011 的数组。
  • 数组中的逆序对数量是指满足条件 i<ji<jai>aja_i>a_j 的索引对 (i,j)(i,j) 的数量。

输入格式

  • 第一行:一个整数 nn,表示二进制数组的长度。
  • 第二行:nn 个整数 a1,a2,...,an (0ai1)a_1, a_2, ..., a_n\ (0 ≤ a_i ≤ 1),表示二进制数组的元素。

输出格式

输出一个整数,表示在执行最多一次翻转操作后,数组可以拥有的最大逆序对数量。

样例输入

5  
1 0 1 0 1

样例输出

5

样例输入

4
1 1 0 0

样例输出

4

说明

样例1解释

翻转最后一个元素,得到 [1,0,1,0,0][1,0,1,0,0],逆序对为 (1,2)(1,2)(1,4)(1,4)(1,5)(1,5)(3,4)(3,4)(3,5)(3,5)

样例2解释

不进行翻转操作,逆序对为 (1,3)(1,3)(1,4)(1,4)(2,3)(2,3)(2,4)(2,4)

数据范围

对于 40%40\% 的数据,1n10001 \le n \le 1000

对于 100%100\% 的数据,1n1051 \le n \le 10^5