Description
Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的
坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相
也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族
0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛
的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。
Input
行 1: 一个整数: N 行 2..N + 1: 每行两个整数,为种族 ID 和 x 坐标。
Output
行 1: 一个整数,阵容平衡的最大的区间的大小。
Sample Input
7
0 11
1 10
1 25
1 12
1 4
0 13
1 22
0 11
1 10
1 25
1 12
1 4
0 13
1 22
Sample Output
11
HINT
输入说明
有7头牛,像这样在数轴上。
输出说明
牛 #1 (at 11), #4 (at 12), #6 (at 13), #7 (at 22) 组成一个平衡的最大的区间,大小为 22-11=11 个单位长度。
Source
感觉和bzoj4236JOIOJI类似啊……
几乎一样……甚至还更加简单……
只不过计算的距离变成了给出的x坐标而已。
用了哈希差值的办法,就省去了排序。
其实直接用数组哈希就可以了。
但是注意一开始距离x是会出现0的,所以处理方法就是所有的x都+1即可。
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int
N=50005;
int n;
int hash[N<<1],sum[2][N];
struct COW{
int id,x;
}cow[N];
bool cmp(COW a,COW b){
return a.x<b.x;
}
int main(){
n=read();
for (int i=1;i<=n;i++)
cow[i].id=read(),cow[i].x=read()+1;
sort(cow+1,cow+1+n,cmp);
sum[0][0]=sum[1][0]=0;
for (int i=1;i<=n;i++)
for (int j=0;j<2;j++)
sum[j][i]=sum[j][i-1]+(cow[i].id==j);
int ans=0; cow[0].x=1;
for (int i=0;i<=n;i++){
int tmp=sum[0][i]-sum[1][i]+50000;
if (!hash[tmp]) hash[tmp]=cow[i+1].x;
else ans=max(ans,cow[i].x-hash[tmp]);
}
printf("%d\n",ans);
return 0;
}