一、算法分析
本来打算找一道水题做,结果这道题做了好久。。。对蒟蒻我来说这已经不算水题了。。。
可以把绿色珠子记为1,红色记为-1,这样的话,如果一个区间i~j的和为0,那么这个区间上的珠子就是“稳定”的,但是考虑数据范围,直接两层for循环找连续0是肯定不行的,所以就要求一下前缀和,这样只要找到距离最远的一对i和j,使得前缀和数组中a[j]-a[i]等于0即可,但是笔者仍然不会怎么找,想了好久突然想到,答案是单调的,也就是说如果有k个珠子满足条件,那k-2,k-4之类的也一定满足,而大于k的不一定满足,而且答案的可能区间很明显是1到n,这样不就可以二分了吗!!!然后下一个要解决的问题就是如何二分,这道题的二分的特殊性在于奇数不能成为答案,所以当mid等于奇数时要加1,于是愉快地写出代码,结果居然死循环!!!手算一下样例之后发现,笔者的二分代码中是l<=r,这个条件在其他二分题中通常适用,但是在本题中却造成了死循环,模拟了一下样例,发现可以改成l<r,这样就不会死循环了。
二、代码及注释
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000005;
char st[maxn];
int a