【瞎搞】 HDU 3299 Distant Galaxy 枚举
line[i]表示矩阵竖边i上左边的点
on1[i]表示竖边i上的点(不包括横边上的点)
on2[i]表示右边竖边i上的点(包括横边上的点)
选取上下两条横边后 对于每个点只要在横边之间就有一条竖线
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #include <time.h>; #define cler(arr, val) memset(arr, val, sizeof(arr)) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 100010;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 0x3f3f3f3f; const int mod = 10000007; struct node { int x,y; }point[200]; bool cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int y[123],on1[111],on2[111],line[111]; int solve(int n,int m) { cler(on1,0); cler(on2,0); cler(line,0); int ans=0; if(m<=2) return n; for(int i=0;i<m;i++) { for(int j=i+1;j<m;j++) { int y1=y[i],y2=y[j]; int num=0; for(int k=0;k<n;k++) { if(k==0||point[k].x!=point[k-1].x) { num++; on1[num]=on2[num]=0; line[num]=line[num-1]+on2[num-1]-on1[num-1]; } if(point[k].y>y1&&point[k].y<y2) on1[num]++; if(point[k].y>=y1&&point[k].y<=y2) on2[num]++; } if(num<=2) return n; int maxv=0;//max(on[i]-line[i]) for(int k=1;k<=num;k++) { ans=max(ans,line[k]+on2[k]+maxv); maxv=max(maxv,on1[k]-line[k]); } } } return ans; } int main() { int t,cas=1; //IN; while(scanf("%d",&t),t) { for(int i=0;i<t;i++) { scanf("%d%d",&point[i].x,&point[i].y); y[i]=point[i].y; } sort(y,y+t); int tol2=1; for(int i=1;i<t;i++) { if(y[i]!=y[i-1]) y[tol2++]=y[i]; } sort(point,point+t,cmp); printf("Case %d: %d\n",cas++,solve(t,tol2)); } }