[CSP-S模拟测试]:E(贪心)

题目传送门(内部题48)


输入格式

第一行一个整数$n$。
接下来$n$行每行两个整数$x_i,y_i$。


输出格式

一行一个整数表示答案。


样例

样例输入$1$:

2
3 7
2 5

样例输出$1$:

2

样例输入$2$:

5
5 15
11 16
16 34
2 14
9 17

样例输出$2$:

96


数据范围与提示

样例$1$解释:

第一组球中权值为$3$的球染成红色,权值为$7$的球染成蓝色。
第一组球中权值为$2$的球染成红色,权值为$5$的球染成蓝色。
$(R_{max}-R_{min})\times (B_{max}-B_{min})=(3-2)\times (7-5)=2$

数据范围:

对于前$10\%$的数据:$n\leqslant 20$
对于前$20\%$的数据:$n\leqslant 50$
对于前$40\%$的数据:$n\leqslant 200$
对于前$40\%$的数据:$n\leqslant 2,000$
对于所有数据:
$1\leqslant {10}^5$
$1\leqslant x_i,y_i\leqslant {10}^9$


题解

考虑贪心。

因为所有数中的最大值和最小值肯定会对答案做贡献,所以分为两种情况:

  $\alpha.$最大值和最小值不是一种颜色,这时候我们只需要把每一组中的$x_i,y_i$中较小的一个选成蓝色,较大的选成红色即可。

  $\beta.$最大值和最小值是一种颜色(设为红色),这时候我们要最小化蓝色的极差,枚举蓝色球的最小值,二分求出最大值即可。

对于这道题的数据,只用考虑情况$\alpha$即可,因为不确定我的代码的情况$\beta$的正确性,所以下面代码只考虑了情况$\alpha$。

时间复杂度:$\Theta(n\log n)$(情况$\alpha$为$\Theta(n)$)。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
int minr=1<<30,minb=1<<30,maxr,maxb;
int main()
{
	scanf("%d",&n);
	while(n--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(x<y)x^=y^=x^=y;
		minr=min(minr,x);
		maxr=max(maxr,x);
		minb=min(minb,y);
		maxb=max(maxb,y);
	}
	cout<<1LL*(maxr-minr)*(maxb-minb);
	return 0;
}

rp++

posted @ 2019-09-21 17:10  HEOI-动动  阅读(301)  评论(0编辑  收藏  举报