链接: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 }