链接:http://arc073.contest.atcoder.jp/tasks/arc073_c
题目大意:给定n对数,将每对中一个染红一个染蓝,求(Rmax-Rmin)*(Bmax-Bmin)。
分析:- -感觉没有太多的知识点,就是有点难想。。
考虑所有数中的MAX和MIN,如果在Rmax=MAX&&Bmin=MIN,就需要让Rmin尽量大,Bmax尽量小,将每一对的大数染红,小数染黑;如果是Bmax=MAX&&Bmin=MIN,就需要让Rmax-Rmin尽量小,首先让所有xi<yi,按x排序,先把x全部染红,然后从小到大按顺序把x y交换,计算交换后的Rmax和Rmin,更新一下Rmax-Rmin的最小值。因为如果存在xi<yi,而xi为红色,继续往后更新,和xi为黑色往后更新相比,最小值可能更小,而最大值不可能更小,因而不需要考虑这种情况。注意当MAX和MIN在同一对里时,不需要考虑后一种情况。
1 #include2 #include 3 #include 4 using namespace std; 5 const int maxn=200005; 6 struct bag{ 7 int x,y; 8 }p[maxn]; 9 bool operator < (bag a,bag b){10 if(a.x==b.x)return a.y p[i].y){23 int k=p[i].x;24 p[i].x=p[i].y;25 p[i].y=k;26 }27 }28 sort(p,p+n);29 int Max=p[0].y,Min=p[0].x,_max=0,_min=0;30 for(int i=1;i =Max){32 Min=p[i].x;Max=p[i].y;33 _max=i;_min=i;34 }35 else if(p[i].x Max){39 Max=p[i].y;40 _max=i;41 }42 }43 Rmax=Max;Bmin=Min;44 Rmin=p[_min].y;Bmax=p[_max].x;45 for(int i=0;i