目录
1.题目
2.题目分析
转化成通俗语言,0代表女,1代表男,我们要在这一段序列中找到长度最大的男女相同的子序列,也就是,0,1相同的子序列。
那么,应该如何做呢?
引入一个相对差的概念。
什么是相对差?
每一个位置我们都记录男女相对差值的大小,两个相对差值相同的端点之间,就是我们的最大长度。
9
0 1 0 0 0 1 1 0 0
为什么呢?
因为两个相对差之间经过了一系列变化最终又成为了那个相对差,这说明什么呢?说明之间的一系列变化全部抵消,也就是说这个区间之间男女相等。
除此之外,我们要注意,不能更新0的左区间,为何,因为最开始就是最左边的0区间,我们要注意分开。
再再再强调几点,我们还需要做什么呢?
很关键的一点就是,我们要加上序列长度n防止出现负值。
3.代码加注释。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int l[N];
int r[N];
int main() {
int n;
cin >> n;
int cnt1 = 0;//统计男生到现在的人数。
int cnt2 = 0;//统计女生到现在的人数
for (int i = 1; i <= n; i++) {
int x;
cin >> x;//统计现在 是男的女的,如果是男的cnt1++反之,cnt2++;
if (x == 1)
cnt1++;
else if (x == 0)
cnt2++;
int t = cnt2 - cnt1 + n;//计算差值。
if (!l[t] && t != n)//如果最左端点没有被更新过,并且差值不为0(因为刚开始差值就是0
l[t] = i;//更新左端点。
else
r[t] = i;//更新右端点
}
int ans = 0;
for (int i = 0; i <= 2 * n; i++)
ans = max(ans, r[i] - l[i]);
cout << ans << "\n";
return 0;
}