题目链接:
https://www.acwing.com/problem/content/1915/
题意:
农夫约翰的 N 头奶牛站在一维长围栏的不同位置。
第 i 头牛位于位置 xi,其所属品种为 bi(根西岛牛或荷斯坦牛)。所有奶牛的位置各不相同。
约翰想给一段连续区间内的奶牛拍摄一张照片,用来在乡村集市上展览。
但是我们希望他所有品种的奶牛都能在照片中得到公平的展示。
因此,他希望确保无论照片中出些哪些品种的奶牛,每种品种的奶牛在照片中的数量都必须相等。
例如,一张照片中只包含荷斯坦牛是可以的,包含荷斯坦牛和根西岛牛各 27 头也没问题,但是包含 10 头荷斯坦牛和 9 头根西岛牛则不可以。
请确定,约翰可以拍下的满足以上条件的照片的最大尺寸。
照片的尺寸是指照片中奶牛最大和最小位置之间的差。
约翰最终可能只拍下一头奶牛,这种情况下,照片尺寸为 0。
思路:
- 一张照片中只包含荷斯坦牛是可以的,就代表一个区间全是一种牛也能作为答案,所以可以算出某一个区间全是一种牛的区间的最大长度
- 包含荷斯坦牛和根西岛牛各 27 头也没问题,代表需要一个区间里面的两种牛的数量相同,则可以用前缀和来做,如果对应一个前缀和数组来说,某两个点的值相同时,则代表以这两个点为端点的这个区间的区间值为0。则可以代表两种牛的数量相同
3.设定让某一种牛代表值为 +1, 某一种牛代表值 -1
代码:
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N = 1e5 + 10;
typedef pair<int, int> PII;
PII a[N];
int s[N];
unordered_map<int, int> pos;
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int x;
char b;
scanf("%d %c", &x, &b);
a[i].x = x;
if(b == 'G') a[i].y = 1;
else a[i].y = -1;
}
sort(a + 1, a + n + 1);
pos[0] = a[1].x;
int ans = 0, last = 0;
//初始化,第一个肯定是可以自己独占一张照片的
s[0] = a[1].y;
for(int i = 1; i <= n; i++)
{
//用来记录当前这个是G还是H
s[i] = a[i].y;
//如果全是一种牛的情况
if(s[i] != s[i - 1])
{
last = a[i].x;
}
ans = max(ans, a[i].x - last);
//两种牛都有的情况下
a[i].y += a[i - 1].y;
int x = a[i].y, d = a[i].x;
if(pos.count(x)) ans = max(ans, d - pos[x]);
else if(i < n) pos[x] = a[i + 1].x;
}
printf("%d\n", ans);
return 0;
}