【瞎搞】 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));
    }
}


posted @ 2014-09-25 21:37  kewowlo  阅读(126)  评论(0编辑  收藏  举报