太菜了只会纯暴力的写法
要注意一下这里有两种情况:
只有一头牛(数量须大于1)
两头牛的数量需要相同
分别讨论即可
一头牛的情况只是一段数组中最大连续数
两头牛用前缀和即可为了使得中间相同我们将一个为1一个为-1即可
#include<iostream>
#include<map>
using namespace std;
const int N=2e5+10;
map<int ,int >mp;
int q[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
char s;
cin>>x>>s;
if(s=='H')
{
mp[x]=1;
}
else mp[x]=-1;
}
int res=0,last=0,ans=0;
//讨论根西岛牛的情况
for(auto i:mp)
{
if(i.second==-1)
{
if(!last)last=i.first;
if(ans>1)res=max(res,i.first-last);
ans++;
}
else
{
ans=0;
last=0;
}
}
last=0;
ans=0;
int ma=0;
//讨论荷斯坦牛的情况
for(auto i:mp)
{
if(i.second==1)
{
if(!last)last=i.first;
if(ans>1)res=max(res,i.first-last);
ans++;
}
else
{
ans=0;
last=0;
}
}
//两头牛同时讨论
int dd=1e5;//这里为了方便,因为可能会有负数,这样就好啦
for(auto i:mp)
{
i.second+=ma;
int x=i.first;
if(!q[ma+dd])q[ma+dd]=x;
if(q[i.second+dd])
{
res=max(res,x-q[i.second+dd]);
}
ma=i.second;
}
cout<<res;
}