Gym - 100781G Goblin Garden Guards (扫描线)
题意:
n 只哥布林,每只哥布林都有一个位置坐标。
m 个炮台,每个炮台都有一个位置坐标和一个攻击半径。
如果一个哥布林在任何一个炮台的攻击范围内,都会被杀死。
求最后没有被杀死的哥布林的数量。
这题暴力加一些小小的优化可以爆过去。。。然后场上并不敢试。
标算是扫描线。炮台攻击范围内的每个横坐标都拉一个扫描线,把线的两端的点和哥布林的点一起加进一个数组。
然后排序,就会发现能被杀死的哥布林的点在一根线的两个端点之间。
直接扫一遍统计答案就可以了。注意存点的数组要开够。
另外就是。。。排序的时候 y 坐标从小到大排序就 WA, 改成从大到小就A了。。我也不知道为啥。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std; #define maxn 9000000 + 1000 struct Node
{
int x, y, type;
Node(int xx, int yy, int tt) : x(xx), y(yy), type(tt) {}
Node() {}
}a[maxn]; bool cmp(Node a, Node b)
{
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y > b.y;
return a.type > b.type;
} int getdis(int x, int y)
{
return round(floor(sqrt(x*x - y*y)));
} int tot = ; int main()
{
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
tot++;
scanf("%d%d", &a[tot].x, &a[tot].y);
a[tot].type = ;
} int m;
scanf("%d", &m);
for (int i = ; i <= m; i++)
{
int x, y, r;
scanf("%d%d%d", &x, &y, &r);
for (int j = -r; j <= r; j++)
{
a[++tot] = Node(x+j, y+getdis(r, j), );
a[++tot] = Node(x+j, y-getdis(r, j), -);
}
} sort(a+, a++tot, cmp); int sum = , ans = ;
for (int i = ; i <= tot; i++)
{
sum += a[i].type;
if (a[i].type == && sum != )
ans++;
} printf("%d\n", n - ans);
}
Gym - 100781G Goblin Garden Guards (扫描线)的更多相关文章
- 【扫描线】Gym - 100781G - Goblin Garden Guards
平面上有100000个哥布林和20000个圆,问你不在圆内的哥布林有多少个. 将每个圆从左到右切2r+1次,形成(2r+1)*2个端点,将上端点记作入点,下端点记作出点,再将这些点和那些哥布林一起排序 ...
- Nordic Collegiate Programming Contest 2015 G. Goblin Garden Guards
In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian city ...
- Gym - 100781G-Goblin Garden Guards
题目链接:https://nanti.jisuanke.com/t/28882 解题思路:单纯的判断点是否在圆内,一一遍历圆外切正方形内的点即可,注意,该题要建个结构体数组存每个地精的位置,再bool ...
- Codeforces Gym 101480C - Cow Confinement(扫描线+线段树)
题面传送门 题意: 有一个 \(10^6\times 10^6\) 的地图.其中 \(m\) 个位置上有花,\(f\) 个矩形外围用栅栏围了起来.保证 \(f\) 个矩形两两之间没有公共点. \(q\ ...
- Nordic Collegiate Programming Contest 2015(第七场)
A:Adjoin the Networks One day your boss explains to you that he has a bunch of computer networks tha ...
- Gym - 101982F Rectangles (扫描线+线段树)
链接:http://codeforces.com/gym/101982/attachments 思路: 问被覆盖次数为奇数次的矩阵的面积并 扫描线求矩阵面积并我们是上界赋为-1,下界赋为1,因为要求覆 ...
- 【扫描线】Gym - 101190E - Expect to Wait
假设初始人数为0, 将每个时刻在等待的人数写下来,就是求个和. 如果纵坐标看成人数,横坐标看成时间,就是求个面积. 因为初始人数不一定为零,所以离线后扫描线即可回答所有询问. #include< ...
- Gym 100733J Summer Wars 题解:灵活运用扫描线的思想
题意: 给你n个点,m个横着的线段.你能够横移这些线段,可是这些线段的相对位置不能改变.假设一个点,在它的正上方和和正下方都有线段(包含线段的终点).则这个点被视为被"屏蔽".问通 ...
- Gym 102028J 扫描线/二维差分 + 解方程
题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https: ...
随机推荐
- ExpandoObject的使用
IDictionary<string, object> obj = new System.Dynamic.ExpandoObject(); obj.Add(); dynamic obj2 ...
- 洛谷-P3927 SAC E#1 - 一道中档题 Factorial
原址 题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. ...
- 使用gulp-uncss精简css,去除冗余代码
写html页面的时候,多修改几次就会出现很多无用的css代码,下面使用gulp-uncss来精简css文件,去掉没用的css代码 1.首先找个目录创建一个gulp项目在命令行输入:npm init ...
- c#基础2-out-ref
//out参数要求在方法的内部 ; JiangJin(ref salary1); Console.WriteLine(salary1); Console.ReadKey(); 必须为其赋值 out.r ...
- 从0到1分步实现一个出生日期的正则表达式(JavaScript)
简言 在表单验证中,经常会用正则表达式做出生日期校验.本文把出生日期分割成几个部分,分步地介绍了实现一个出生日期校验的完整过程.相信您在理解了本篇的内容后,对如何编写和如何应用正则表达式会有进一步的理 ...
- GoDaddy网站程序根目录 网站文件上传到虚拟主机哪个目录
用的linux虚拟主机,网站根目录为public_html,(window主机的目录为httpdocs)我们需要把本地做好的网站上传到此目录下 cPanel控制面板 - 文件管理器 - public_ ...
- uvm_reg_backdoor——寄存器模型(十)
寄存器有前门和后门两种访问方式,这儿只看后门访问方式 //----------------------------------------------------------------------- ...
- ios中frame设置宽高计算的Demo
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int totalHeightOfScrollView = scrollView.con ...
- ABAP function group和Tomcat library重复加载问题
ABAP ABAP help文档里对**LOAD-OF-PROGRAM"的关键字是这样描述的: This event keyword defines the program construc ...
- MVC批量上传文件(使用uploadify)
<script src="JS/jquery-1.8.3.js"></script> <script src="uploadify/jque ...