《平衡》题解

平衡

描述
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值