平衡
描述
N个数字不是0就是1
N<=50000
分布在一条直线上,每个数字有它的坐标,坐标范围为0…1,000,000,000
请算出最广阔的区间,使这个区间0的个数等于1的个数。 区间的大小为区间内最右边的数字的坐标减去最左边的数字的坐标。 保证 数字0与1至少有一个。 没有某两个数字的坐标相同。
输入
行 1: 一个整数: N
行 2…N + 1: 每行两个整数,为种类 ID 和 坐标。
输出如题
样例
输入
7
0 11
1 10
1 25
1 12
1 4
0 13
1 22
输出
11
将0变成-1,统计前缀和,在进行一些前缀和的基本操作即可
> 完整代码如下
#include <bits/stdc++.h>
using namespace std;
long long n,s[50010],maxx;
struct LK{
long long a,pd;
}A[50010];
bool cmp(LK x,LK y){return x.pd<y.pd;}
int main(){
cin>>n;
for(int i=1 ; i<=n ; i++){
cin>>A[i].a>>A[i].pd;
if(A[i].a==0)A[i].a--;
}
sort(A+1,A+n+1,cmp);
for(int i=1 ; i<=n ; i++)s[i]=s[i-1]+A[i].a;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(s[j]-s[i-1]==0)
maxx=max(maxx,A[j].pd-A[i].pd);
cout<<maxx;
return 0;
}
注:此题双重循环不会TLE