• Atcoder 073E


    链接: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 }
  • 相关阅读:
    Codeforces 963A Alternating Sum 【数论+数学】
    大数相加 a+b
    BFS(广度优先搜索) poj3278
    PHPExcel 学习笔记
    一个高在线(可以超过1024)多线程的socket echo server(pthreads 和 libevent扩展)
    php pthreads 多线程扩展的使用:一个较为稳定例子。
    PHP 长字符串替换操作性能(替换多换注释的代码)
    最简单的PHP socket echo server。
    PHP 多线程扩展(正儿八经的线程)pthreads安装
    定长度结构体数组、不定长度结构体指针初始化
  • 原文地址:https://www.cnblogs.com/7391-KID/p/7078683.html
Copyright © 2020-2023  润新知