UVA - 1398 Meteor

 

Input
Your program is to read the input from standard input. The input consists of T test cases. The
number of test cases T is given in the first line of the input. Each test case starts with a line containing
two integers w and h (1 ≤ w, h ≤ 100, 000), the width and height of the telescope frame, which are
separated by single space. The second line contains an integer n, the number of input points (meteors),
1 ≤ n ≤ 100, 000. Each of the next n lines contain four integers x i , y i , a i , and b i ; (x i , y i ) is the starting
point p i and (a i , b i ) is the nonzero velocity vector v i of the i-th meteor; x i and y i are integer values
between -200,000 and 200,000, and a i and b i are integer values between -10 and 10. Note that at least
one of a i and b i is not zero. These four values are separated by single spaces. We assume that all
starting points p i are distinct.
Output
Your program is to write to standard output. Print the maximum number of meteors which can be in
the telescope frame at some moment.
Sample Input
2
4 2
2
-1 1 1 -1
5 2 -1 -1
13 6
7
3 -2 1 3
6 9 -2 -1
8 0 -1 -1
7 6 10 0
11 -2 2 1
-2 4 6 -1
3 2 -5 -1
Sample Output
1
2

 

1.如何求交点(列不等式,求t的范围,注意速度的正负)

2.如何求某时间内最大值(扫描线进行端点的扫描,所有端点排序,左端点+,右端点-)

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

struct Event {
    double x; //端点时间值,用于排序
    bool type; //是否为右端点

    bool operator<(const Event &e) {
        return x < e.x || (x == e.x and type); //右端点先排前面
    }
} events[100000 * 2];

//由0<x+vt<w得出
void update(int x, int w, int v, double &L, double &R) {
    if (v == 0) {
        if (x <= 0 || x >= w)
            R = L - 1;
    } else if (v > 0) {
        L = max((double) -x / v, L);
        R = min((double) (w - x) / v, R);
    } else {
        L = max((double) (w - x) / v, L);
        R = min((double) -x / v, R);
    }
}

int main() {
    int T, w, h, n;
    cin >> T;
    while (T--) {
        cin >> w >> h;
        int x, y, a, b, e = 0, ans = 0;
        cin >> n;
        for (int i = 0; i < n; ++i) {
            cin >> x >> y >> a >> b;
            double L = 0, R = 1e6;
            update(x, w, a, L, R);
            update(y, h, b, L, R);
            if (L < R) {
                events[e++] = {L, 0};
                events[e++] = {R, 1};
            }
        }
        sort(events, events + e);
        for (int i = 0, cnt = 0; i < e; ++i) {
            cnt += events[i].type ? -1 : 1; //右端点-左端点+
            ans = max(ans, cnt);
        }
        cout << ans << endl;
    }
}

 

posted @ 2017-10-06 13:39  少年啦飞驰  阅读(130)  评论(0编辑  收藏  举报