LA 3695 Distant Galaxy(扫描线)

Distant Galaxy

3000ms
131072KB
This problem will be judged on UVALive. Original ID:  3695
64-bit integer IO format:  %lld      Java class name:  Main
Font Size:   
Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                    
  • [PDF Link]

    You are observing a distant galaxy using a telescope above the Astronomy Tower, and you think that a rectangle drawn in that galaxy whose edges are parallel to coordinate axes and contain maximum star systems on its edges has a great deal to do with the mysteries of universe. However you do not have the laptop with you, thus you have written the coordinates of all star systems down on a piece of paper and decide to work out the result later. Can you finish this task?

    \epsfbox{p3694.eps}

    Input

    There are multiple test cases in the input file. Each test case starts with one integer N , (1$ \le$N$ \le$100) , the number of star systems on the telescope. N lines follow, each line consists of two integers: the X and Y coordinates of the K -th planet system. The absolute value of any coordinate is no more than 109 , and you can assume that the planets are arbitrarily distributed in the universe.

    N = 0 indicates the end of input file and should not be processed by your program.

    Output

    For each test case, output the maximum value you have found on a single line in the format as indicated in the sample output.

    Sample Input

    10 
    2 3 
    9 2 
    7 4 
    3 4 
    5 7 
    1 5 
    10 4 
    10 6 
    11 4 
    4 6 
    0
    

    Sample Output

    Case 1: 7
    

    Source


    给出n个点坐标,找一个矩形,使边界上的点最多。思路枚举上下边界,然后用扫描线,大白P53


    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e2 + 10;
    struct Node {
        int x,y;
        bool operator < (const Node & rhs) const {
            return x < rhs.x;
        }
    }p[maxn];
    int y[maxn];
    int L[maxn],on[maxn],on2[maxn];
    int solve(int n)
    {
        sort(p,p+n);
        sort(y,y+n);
    
        int m = unique(y,y+n) - y;
        if(m < 3) return n; ///不超过两个y坐标
        int ans = 0;
        for(int a = 0; a < m; ++a) {
            for(int b = a+1; b < m; ++b) {
                int k = 0,ymin = y[a],ymax = y[b];
                for(int i = 0; i < n; ++i) {
                    if(i==0 || p[i].x != p[i-1].x) { ///新的竖线
                        ++k;
                        on[k] = 0;
                        on2[k] = 0;
                        L[k] = L[k-1] + on2[k-1] - on[k-1];
                    }
                    if(p[i].y > ymin && p[i].y < ymax) ++on[k];
                    if(p[i].y >= ymin && p[i].y <= ymax) ++on2[k];
                }
                if(k < 3) return n; ///不超过两个x坐标
                int M = 0;
                for(int i = 1; i <= k; ++i) {
                    ans = max(ans,L[i]+on2[i]+M);
                    M = max(M,on[i]-L[i]);
                }
            }
        }
        return ans;
    }
    int main()
    {
        int n,cas = 0;
        while(scanf("%d",&n)==1&& n) {
            ++cas;
            for(int i = 0; i < n; ++i) {
                scanf("%d%d",&p[i].x,&p[i].y);
                y[i] = p[i].y;
            }
            int ans = solve(n);
            printf("Case %d: %d\n",cas,ans);
        }
        return 0;
    }
    



    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值