题目传送门(内部题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}) imes (B_{max}-B_{min})=(3-2) imes (7-5)=2$
数据范围:
对于前$10\%$的数据:$nleqslant 20$
对于前$20\%$的数据:$nleqslant 50$
对于前$40\%$的数据:$nleqslant 200$
对于前$40\%$的数据:$nleqslant 2,000$
对于所有数据:
$1leqslant {10}^5$
$1leqslant x_i,y_ileqslant {10}^9$
题解
考虑贪心。
因为所有数中的最大值和最小值肯定会对答案做贡献,所以分为两种情况:
$alpha.$最大值和最小值不是一种颜色,这时候我们只需要把每一组中的$x_i,y_i$中较小的一个选成蓝色,较大的选成红色即可。
$eta.$最大值和最小值是一种颜色(设为红色),这时候我们要最小化蓝色的极差,枚举蓝色球的最小值,二分求出最大值即可。
对于这道题的数据,只用考虑情况$alpha$即可,因为不确定我的代码的情况$eta$的正确性,所以下面代码只考虑了情况$alpha$。
时间复杂度:$Theta(nlog 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++