标签:typedef 限制 second mit problems 提示 solution rbegin HERE
3
1 2
3 4
5 6
15
The optimal solution is to paint the balls with x1, x2, y3 red, and paint the balls with y1, y2, x3 blue.
思维题,解法:
考虑所有数中最大的和最小的:MIN,MAXMIN,MAX,它们要么在两个集合中,要么只在一个集合中。不失一般性,我们考虑以下两种情况: 
   
  1.Rmin=MIN,Bmax=MAXRmin=MIN,Bmax=MAX 
  这时,我们要最小化RmaxRmax,最大化BminBmin,那么就只要在分组时把小的分给RR,大的分给BB即可。 
   
  2.Rmin=MIN,Rmax=MAXRmin=MIN,Rmax=MAX 
  这时,只需最小化Bmax?BminBmax?Bmin。这样的话我们知道肯定是要取,比如说2n2n个数一起排完序后,中间连续互斥的nn个。这样的话,我们先让每组中的xi<yixi<yi,然后按照xx数组排序,先让BB数组取x1~xnx1~xn,然后再逐个把xixi调成yiyi计算答案即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const long long INF=1e18+10;
typedef pair<long long,long long>PA;
vector<PA> V;
multiset<long long>R,B;
int cmp(PA a,PA b)
{
    return a.first<b.first;
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    long long x,y,ans;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>x>>y;
        V.push_back(make_pair(min(x,y),max(x,y)));
        R.insert(min(x,y));
        B.insert(max(x,y));
    }
    long long maR=-INF,maB=-INF;
    long long miR=INF,miB=INF;
    sort(V.begin(),V.end(),cmp);
    for(int i=0; i<V.size(); i++)
    {
        maR=max(V[i].first,maR);
        maB=max(V[i].second,maB);
        miR=min(V[i].first,miR);
        miB=min(V[i].second,miB);
    }
    ans=(maR-miR)*(maB-miB);
    for(int i=0; i<V.size(); i++)
    {
        R.erase(R.find(V[i].first));
        B.insert(V[i].first);
        B.erase(B.find(V[i].second));
        R.insert(V[i].second);
        ans=min(ans,(*R.rbegin()-*R.begin())*(*B.rbegin()-*B.begin()));
    }
    cout<<ans<<endl;
    return 0;
}
标签:typedef 限制 second mit problems 提示 solution rbegin HERE
原文地址:https://www.cnblogs.com/lglh/p/9179238.html