Atcoder 073E - Ball Coloring

链接: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 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 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<b.y;
11     return a.x<b.x;
12 }
13 int n,Rmax,Rmin,Bmax,Bmin;
14 int main(){
15     long long ans=1e18;
16     scanf("%d",&n);
17     if(n==1){
18         cout<<0<<endl;return 0;
19     }
20     for(int i=0;i<n;i++){
21         scanf("%d%d",&p[i].x,&p[i].y);
22         if(p[i].x>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<n;i++){
31         if(p[i].x<=Min&&p[i].y>=Max){
32             Min=p[i].x;Max=p[i].y;
33             _max=i;_min=i;
34         }
35         else if(p[i].x<Min){
36             Min=p[i].x;
37             _min=i;
38         }else if(p[i].y>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<n;i++){
46         Rmin=min(Rmin,p[i].y);
47         Bmax=max(Bmax,p[i].x);
48     }
49     ans=(long long)(Rmax-Rmin)*(Bmax-Bmin);
50     if(_max!=_min){
51         Bmax=Max;Bmin=Min;
52         Rmax=max(p[n-1].x,p[0].y);
53         int premin=p[0].y;
54         Rmin=min(p[0].y,p[1].x);
55         //sort(p,p+n);
56         long long ans0=Rmax-Rmin;
57         for(int i=1;i<n-1;i++){
58             Rmax=max(p[i].y,Rmax);
59             Rmin=min(min(premin,p[i].y),p[i+1].x);
60             premin=min(premin,p[i].y);
61             if(Rmax-Rmin<ans0)ans0=Rmax-Rmin;
62         }
63         ans0*=Bmax-Bmin;
64         ans=min(ans,ans0);
65     }
66     cout<<ans<<endl;
67     return 0;
68 }

 

posted @ 2017-06-26 01:29  7391_KID  阅读(498)  评论(0)    收藏  举报