【2012百度之星/初赛上】C:集合的交与并

对于一个闭区间集合{A1,A2……AK}(K>1,Ai≠Aj{i≠j}),我们定义其权值

其中|X|表示X区间的长度;如果X为空集|X|=0。

当然,如果这些闭区间没有交集则权值为0。

给定N个各不相同的闭区间,请你从中找出若干个(至少2个)区间使其权值最大。

输入

第一行一个整数N (2 <= N <= 105)

接下来N行每行两个整数 l r(1<=l<=r<=106),表示闭区间的两个端点。

输出

最大权值

样例输入

4

1 6

4 8

2 7

3 5

样例输出

24

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct Node
{
	int l , r;
}node[100005];

int cmp(const Node &a , const Node &b)
{
	if(a.l != b.l)
		return a.l < b.l;
	else if( a.r != b.r)
		return a.r < b.r;
}
long long maxx(long long a , long long b)
{
	if(a > b)
		return a;
	else
		return b;
}
int main(void)
{
	int i , j , n;
	cin >> n;
	for(i = 0 ; i < n ; ++i)
	{
		cin >> node[i].l >> node[i].r;
	}
	sort(node , node+n , cmp);
	long long ans = 0;
	for(i = 0 ; i < n - 1 ; ++i)
	{
		for(j = i + 1 ; j < n ; ++j)
		{
			if(node[j].l >= node[i].r)
				break;
			ans = maxx(ans,(long long )(node[j].r-node[i].l)*(node[i].r-node[j].l));
		}
	}
	cout << ans << endl;
	return 0;
}


你可能感兴趣的:(c,百度)