题目要求 求R 与 B 的个数之差最大的连续区间(因为题目没说清楚,所以这里需要分两种情况来看)
这样的话我们可以在求 R - B 的时候,将R初始话为1,B 初始化为-1,那么问题就转化为只含有1,-1的序列,求区间和最大的区间的范围,同理, 求B - R的时候,反过来即可(一定要仔细看题,题目要求的范围是整体偏左的,卡这了..
大概思路就是 :序列只含有1,和 -1, 那么我想要答案最大,那么要保证我当前维护的区间的长度至少要大于等于0,只要sum =(之前维护的序列的和+当前的a[i](1或-1)), >= 0,那么我就要加到队列,但是,我加到队列并不代表我要更新区间的范围,只有当 sum > maxx,我才更新区间的范围。如果sum + a[i] < 0,那么我从i之前包括i都扔掉,重新开始寻找范围
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
deque<int> q;
string s;
void f(int sum, int &l, int &r, int &maxx)
{
int len = s.size();
for (int i = 0; i < len; i++)
{
if (sum + a[i] >= 0)
{
q.push_back(i);
sum += a[i];
if (sum > maxx)
{
maxx = sum;
l = q.front();
r = i;
}
}
else
{
q.clear();
sum = 0;
}
}
l++;
r++;
}
int main()
{
cin >> s;
int len = s.size();
for (int i = 0; i < len; i++)
{
if (s[i] == 'R')
a[i] = 1;
else
a[i] = -1;
}
int sum = 0;
int l = -1, r = -1;
int maxx = 0;
f(sum, l, r, maxx);
for (int i = 0; i < len; i++)
{
if (s[i] == 'B')
a[i] = 1;
else
a[i] = -1;
}
q.clear();
int sum1 = 0;
int l1 = -1, r1 = -1;
int max1 = 0;
f(sum1, l1, r1, max1);
// cout << l << ' ' << r << endl;
// cout << l1 << ' ' << r1 << endl;
if (maxx > max1)
{
cout << l << ' ' << r << endl;
// cout << 'Y' << endl;
}
else if (maxx < max1)
{
cout << l1 << ' ' << r1 << endl;
// cout << 'X' << endl;
}
else
{
if (l1 == l)
{
cout << l << ' ' << min(r, r1) << endl;
}
else if (r1 == r)
{
cout << min(l, l1) << ' ' << r << endl;
}
else
{
if (l < l1)
cout << l << ' ' << r << endl;
else
cout << l1 << ' ' << r1 << endl;
}
}
return 0;
}
.)