[ARC073C] Ball Coloring
Solution
我们发现编号的最大值maxmaxmax必然会在Rmax,BmaxR_{max},B_{max}Rmax,Bmax中至少一个出现,最小值minminmin必然会在Rmin,BminR_{min},B_{min}Rmin,Bmin中至少一个出现。
因此会有四种情况:
- Rmax=max,Rmin=minR_{max}=max,R_{min}=minRmax=max,Rmin=min
- Rmax=max,Bmin=minR_{max}=max,B_{min}=minRmax=max,Bmin=min
- Bmax=max,Rmin=minB_{max}=max,R_{min}=minBmax=max,Rmin=min
- Bmax=max,Bmin=minB_{max}=max,B_{min}=minBmax=max,Bmin=min
因为R,BR,BR,B等价,所以condition3,4condition\;3,4condition3,4都可以不考虑。
我们先考虑condition1condition\;1condition1,此时答案为(max−min)(Bmax−Bmin)(max-min)(B_{max}-B_{min})(max−min)(Bmax−Bmin),所以相当于RRR是个垃圾桶,随便什么数都可以放,而BBB中的数必须在Bmin,BmaxB_{min},B_{max}Bmin,Bmax之间,于是我们可以枚举t=Bmint=B_{min}t=Bmin,让BmaxB_{max}Bmax尽量小,于是对于一个包(x,y)(x,y)(x,y),不妨令x≤yx \leq yx≤y。
- 若x≤y<tx\leq y<tx≤y<t,则无解。
- 若x<t≤yx< t\leq yx<t≤y,则把yyy涂成BBB。
- 若t≤x≤yt\leq x\leq yt≤x≤y,则把xxx涂成BBB。
可以离散化,然后把所有(x,y)(x,y)(x,y)按xxx排序,模拟这个变化过程,时间复杂度O(nlgn)O(nlgn)O(nlgn)。
再来考虑condition2condition\;2condition2,此时答案为(max−Rmin)(Bmax−min)(max-R_{min})(B_{max}-min)(max−Rmin)(Bmax−min),我们同样可以枚举t=Rmint=R_{min}t=Rmin,对于每个(x,y),x<y(x,y),x<y(x,y),x<y,有:
- 若x≤y<tx\leq y<tx≤y<t,则无解。
- 若x<t≤yx< t\leq yx<t≤y,则把yyy涂成RRR。
- 若t≤x≤yt\leq x\leq yt≤x≤y,则把yyy涂成RRR。
因此我们会只会让yyy涂成RRR,xxx涂成BBB,直接O(n)O(n)O(n)计算即可。
总时间复杂度O(nlgn)O(nlgn)O(nlgn)。
Code
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
PR a[MAXN];
int b[MAXN];
ll solve1(int n)
{int mn=INF,mx=-INF,nw=-INF,lim=INF;for (int i=1;i<=n;i++) upmin(mn,a[i].fi),upmax(mx,a[i].se),upmax(nw,a[i].fi),upmin(lim,a[i].se);ll ans=loo;int num=0;for (int i=1;i<=n;i++) b[++num]=a[i].fi,b[++num]=a[i].se;sort(b+1,b+num+1);num=unique(b+1,b+num+1)-b-1;for (int i=1,l=1;i<=num;i++){if (b[i]>lim) return ans;while (l<=n&&b[i]>a[l].fi) upmax(nw,a[l].se),l++;upmin(ans,1ll*(mx-mn)*(nw-b[i]));}
}
ll solve2(int n)
{int mn1=INF,mn2=INF,mx1=-INF,mx2=-INF;for (int i=1;i<=n;i++) upmin(mn1,a[i].fi),upmax(mx1,a[i].fi),upmin(mn2,a[i].se),upmax(mx2,a[i].se);return 1ll*(mx1-mn1)*(mx2-mn2);
}
signed main()
{int n=read();for (int i=1;i<=n;i++) a[i].fi=read(),a[i].se=read();for (int i=1;i<=n;i++) if (a[i].fi>a[i].se) swap(a[i].fi,a[i].se);sort(a+1,a+n+1);printf("%lld\n",min(solve1(n),solve2(n)));return 0;
}