【UVALive】3695 Distant Galaxy(......)

时间:2023-03-09 19:10:03
【UVALive】3695 Distant Galaxy(......)

题目

传送门:QWQ

分析

好喵啊~~~~

不会做

正解看蓝书P53吧

代码

#include <cstdio>
#include <algorithm>
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while (ch < '' || ch > ''){if (ch == '-')f = -;ch = getchar();}
while (ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
struct Point{
int x,y;
bool operator < (const Point& rhs) const{
return x<rhs.x;
}
};
const int maxn=;
Point P[maxn]; int n,m,y[maxn],on[maxn],on2[maxn],left[maxn];
int solve(){
sort(P,P+n); sort(y,y+n);
m=unique(y,y+n)-y;
if(m<=) return n;
int ans=;
for(int a=;a<m;a++)
for(int b=a+;b<m;b++){
int ymin=y[a], ymax=y[b];
int k=;
for(int i=;i<n;i++){
if(i== || P[i].x!=P[i-].x){
k++;
on[k]=on2[k]=;
left[k]=k==?:left[k-]+on2[k-]-on[k-];
}
if(P[i].y>ymin && P[i].y<ymax) on[k]++;
if(P[i].y>=ymin && P[i].y<=ymax) on2[k]++;
}
if(k<=) return n;
int M=;
for(int j=;j<=k;j++){
ans=max(ans,left[j]+on2[j]+M);
M=max(M,on[j]-left[j]);
}
}
return ans;
}
int main(){
int kase=;
while(scanf("%d",&n)== && n){
for(int i=;i<n;i++){P[i].x=read();P[i].y=read();y[i]=P[i].y;}
printf("Case %d: %d\n",++kase,solve());
}
return ;
}