LA 3905 Meteor

给出一些点的初始位置(x, y)及速度(a, b)和一个矩形框,求能同时出现在矩形框内部的点数的最大值。

把每个点进出矩形的时刻分别看做一个事件,则每个点可能对应两个事件,进入事件和离开事件。

按这些事件的发生时间进行排序,然后逐个扫描,遇到进入事件cnt++,遇到离开事件--cnt,用ans记录cnt的最大值。

对时间相同情况的处理,当一个进入事件的时刻和离开事件的时刻相同时,应该先处理离开事件后处理进入事件。

因为速度(a, b)是-10~10的整数,所以乘以LCM(1,2,3,,,10) = 2520,可避免浮点数的运算。

后来我还在纳闷t≥0的条件是如何限制的,后来明白因为L的初值为0,所以max(L, t)是不会出现负数的情况的。

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 100000 + 10;
 9 const int LCM = 2520;
10
11 struct Event
12 {
13     int x;
14     int type;
15     bool operator < (const Event a) const
16     {
17         return x < a.x || (x == a.x && type > a.type);
18     }
19 }events[maxn * 2];
20
21 void update(int x, int a, int w, int &L, int &R)
22 {//0<x+at<w
23     if(a == 0)
24     {
25         if(x <= 0 || x >= w)
26             R = L - 1;
27     }
28     else if(a > 0)
29     {
30         L = max(L, -x*LCM/a);
31         R = min(R, (w-x)*LCM/a);
32     }
33     else
34     {
35         L = max(L, (w-x)*LCM/a);
36         R = min(R, -x*LCM/a);
37     }
38 }
39
40 int main(void)
41 {
42     #ifdef LOCAL
43         freopen("3905in.txt", "r", stdin);
44     #endif
45
46     int T;
47     scanf("%d", &T);
48     while(T--)
49     {
50         int w, h, n, e = 0;
51         scanf("%d%d%d", &w, &h, &n);
52         for(int i = 0; i < n; ++i)
53         {
54             int x, y, a, b;
55             scanf("%d%d%d%d", &x, &y, &a, &b);
56             int L = 0, R = (int)1e9;
57             update(x, a, w, L, R);
58             update(y, b, h, L ,R);
59             if(L < R)
60             {
61                 events[e].x = L;    //左端点事件
62                 events[e++].type = 0;
63                 events[e].x = R;
64                 events[e++].type = 1;
65             }
66         }
67         sort(events, events + e);
68         int cnt = 0, ans = 0;
69         for(int i = 0; i < e; ++i)
70         {
71             if(events[i].type == 0)
72                 ans = max(ans, ++cnt);
73             else
74                 --cnt;
75         }
76         printf("%d\n", ans);
77     }
78     return 0;
79 }

代码君

LA 3905 Meteor,布布扣,bubuko.com

时间: 2024-10-26 14:34:05

LA 3905 Meteor的相关文章

LA - 3905 ——Meteor 流星

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16454 1.对于每一颗流星而言,真正有意义的是它穿越矩形的有效时间,所以其实我们需要得到所有流星的有效时间 2.这样的话,原问题就转化更加具体的:某个时刻最多同时穿过多少个时间段? 解决方案: 将每一个时间区间,转化为两个事件:开始事件和结束事件.我们对所有事件按照时间排序,然后我们有一个初始化为0的tot变量计数,接着遍历这个序列,遇到开始事件就+1,遇到结束时间就

LA 3905 Meteor 扫描线

The famous Korean internet company nhn has provided an internet-based photo service which allows The famous Korean internet company users to directly take a photo of an astronomical phenomenon in space by controlling a high-performance telescope owne

3905 - Meteor

The famous Korean internet company nhn has provided an internet-based photo service which allows The famous Korean internet company users to directly take a photo of an astronomical phenomenon in space by controlling a high-performance telescope owne

[2016-03-20][UVALive][3905][Meteor]

时间:2016-03-20 20:14:20 星期日 题目编号:[2016-03-20][UVALive][3905][Meteor] 题目大意:给定一定大小的相框,相框的右下角为坐标原点,给定n个星星的起始位置和运动方向,问相框内最多能捕捉到多少星星 方法: 把星星的运动方向分解成x和y两个方向,计算两个方向经过相框的时间,得到每个星星在相框的时间范围,题目就转换成,最多区间相交问题 计算时间: 计算直线上x为起点,a为增量,经过边界为w的时间对应的l和r 已知 0 < x + at < w

【UVALive】3905 Meteor(扫描线)

题目 传送门:QWQ 分析 扫描线搞一搞. 按左端点排序,左端点相同时按右端点排序. 如果是左端点就$ cnt++ $,否则$ cnt-- $ 统计一下$ Max $就行了 代码 #include <bits/stdc++.h> using namespace std; void update(int x,int a,int w,double& L,double& R){ if(a==0){ if(x<=0||x>=w) R=L-1; } else if(a>

D - Meteor

LA 3905 题意:有一个照相机相框,只有在相框内的点才可以被拍到,每一个点都有起始位置(x,y)和速度(a,b),问这个相框最多可以拍摄到多少个点 思路:拍摄肯定是一个瞬时性的动作,那么最终拍摄到点的多少肯定与时间的选取有关,因此可以吧所有的点在相框内出现的时间转化为一个区间. 最后进行遍历,遇到左区间加一,遇到右区间减一 #include <iostream> #include <algorithm> #include <cstdio> using namespa

计算几何题目分类

转载 一.基础题目 1.1 有固定算法的题目 A, 最近点对问题最近点对问题的算法基于扫描线算法.ZOJ 2107    Quoit Design    典型最近点对问题POJ    3714    Raid    变种最近点对问题 B,最小包围圆最小包围圆的算法是一种增量算法,期望是O(n).ZOJ    1450    Minimal Circle  HDU    3007    Buried memory C,旋转卡壳POJ 3608    Bridge Across Islands   

oracle/node-oracledb 数据库驱动 与 Meteor 驱动包!

oracle/node-oracledb: https://github.com/oracle/node-oracledb   Oracle 官方维护. metstrike/meteor-oracle: https://github.com/metstrike/meteor-oracle Oracle Database Driver for Meteor. Translates the meteor collection operations into SQL. Detailed install

Meteor:组件思想

受React组件思想启发,本文讨论在Meteor客户端应用组件化思想,以Spacebar模板语言为例. 所谓前端组件(我的定义),是一组html代码以及相关样式.行为的封装.它可被复用,通过传递参数进行初始化,并可以调用其定义的方法对其进行控制.并且,其状态,样式都是局部封装的,不会扩散并影响全局. 典型地,一个组件具有data和states(React中叫做props和statues).data是外部传入,用于构建.渲染组件的数据,在组件实例的整个生命周期中是不变的.states是组件内部封装