题目链接:

http://acm.hust.edu.cn/vjudge/problem/87213

Strange Antennas

Time Limit: 3000MS
## 题意
> 一个雷达能够辐射到的范围为等腰三角形,现在给你雷达的坐标,辐射范围和方向,问你求被奇数个雷达辐射到的网格有多少个。

题解

首先,雷达是建在交叉点上的,而考虑覆盖范围是在网格上的,所以需要坐标转换(题目样例第四行有错,应为1,5,4,0)。

其次我们可以考虑每一行都做一遍,然后枚举每个雷达对这一行的影响,没个雷达对这一行的影响就变成了一个区间,这样会变成区间覆盖问题,我们要求的就是覆盖奇数次的区间的长度。这个问题可以用扫描线+离散化来做。(具体看代码)

时间复杂度:O(nmlogm)

代码

  1. #include<map>
  2. #include<cmath>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstdio>
  6. #include<string>
  7. #include<cstring>
  8. #include<iostream>
  9. #include<algorithm>
  10. using namespace std;
  11. #define X first
  12. #define Y second
  13. #define mkp make_pair
  14. #define lson (o<<1)
  15. #define rson ((o<<1)|1)
  16. #define mid (l+(r-l)/2)
  17. #define sz() size()
  18. #define pb(v) push_back(v)
  19. #define all(o) (o).begin(),(o).end()
  20. #define clr(a,v) memset(a,v,sizeof(a))
  21. #define bug(a) cout<<#a<<" = "<<a<<endl
  22. #define rep(i,a,b) for(int i=a;i<(b);i++)
  23. typedef long long LL;
  24. typedef vector<int> VI;
  25. typedef pair<int,int> PII;
  26. typedef vector<pair<int,int> > VPII;
  27. const int INF=0x3f3f3f3f;
  28. const LL INFL=0x3f3f3f3f3f3f3f3fLL;
  29. const double eps=1e-8;
  30. //start----------------------------------------------------------------------
  31. const int maxm=111;
  32. const int maxn=30101;
  33. int n,m;
  34. struct Node {
  35. int x,y,p,d;
  36. } nds[maxm];
  37. int main() {
  38. while(scanf("%d",&n)==1) {
  39. scanf("%d",&m);
  40. rep(i,0,m) {
  41. scanf("%d%d%d%d",&nds[i].x,&nds[i].y,&nds[i].p,&nds[i].d);
  42. if(nds[i].d==0) nds[i].y--;
  43. else if(nds[i].d==2) nds[i].x--;
  44. else if(nds[i].d==3) nds[i].x--,nds[i].y--;
  45. }
  46. int ans=0;
  47. rep(i,0,n) {
  48. VPII arr;
  49. rep(j,0,m) {
  50. int l=INF,r=-1,len;
  51. Node& e=nds[j];
  52. if(e.d==2) {
  53. if(i>e.x-e.p&&i<=e.x) {
  54. len=e.p-(e.x-i);
  55. l=e.y;
  56. r=l+len;
  57. }
  58. } else if(e.d==3) {
  59. if(i>e.x-e.p&&i<=e.x) {
  60. len=e.p-(e.x-i);
  61. r=e.y+1;
  62. l=r-len;
  63. }
  64. } else if(e.d==0) {
  65. if(i<e.x+e.p&&i>=e.x) {
  66. len=e.p-(i-e.x);
  67. r=e.y+1;
  68. l=r-len;
  69. }
  70. } else if(e.d==1) {
  71. if(i<e.x+e.p&&i>=e.x) {
  72. len=e.p-(i-e.x);
  73. l=e.y;
  74. r=l+len;
  75. }
  76. }
  77. l=max(0,l);
  78. r=min(r,n);
  79. if(l<r){
  80. arr.push_back(mkp(l, 1));
  81. arr.push_back(mkp(r,-1));
  82. }
  83. }
  84. sort(all(arr));
  85. int cnt=0,res=0;
  86. rep(j,0,arr.size()) {
  87. if(cnt&1){
  88. res+=arr[j].X-arr[j-1].X;
  89. }
  90. cnt+=arr[j].Y;
  91. }
  92. ans+=res;
  93. }
  94. printf("%d\n",ans);
  95. }
  96. return 0;
  97. }
  98. //end-----------------------------------------------------------------------

UVALive - 6864 Strange Antennas 扫描线的更多相关文章

  1. 扫描线 - UVALive - 6864 Strange Antennas

    Strange Antennas Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=87213 M ...

  2. UVALive 3953 Strange Billboard (状态压缩+枚举)

    Strange Billboard 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/A Description The marke ...

  3. UVaLive 3695 Distant Galaxy (扫描线)

    题意:给平面上的 n 个点,找出一个矩形,使得边界上包含尽量多的点. 析:如果暴力那么就是枚举上下边界,左右边界,还得统计个数,时间复杂度太高,所以我们考虑用扫描线来做,枚举上下边界, 然后用其他方法 ...

  4. UVaLive 3695 City Game (扫描线)

    题意:给定m*n的矩阵,有的是空地有的是墙,找出一个面积最大的子矩阵. 析:如果暴力,一定会超时的.我们可以使用扫描线,up[i][j] 表示从(i, j)向上可以到达的最高高度,left[i][j] ...

  5. uvalive6468,51cthink1419 Strange Antennas (离散化)

    题意: 在一个 n x n 的平面上,给定 m 个等腰直角三角形(各点均为整数),问该平面上被三角形覆盖奇数次的点有多少个. 思路: 由于 n 较大,不能模拟解决,故使用离散化思想. 考虑每一行有多少 ...

  6. Gym 101470 题解

    A:Banks 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt&q ...

  7. UVALive 4221 Walk in the Park 扫描线

    Walk in the Park 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemi ...

  8. 【UVALive】3905 Meteor(扫描线)

    题目 传送门:QWQ 分析 扫描线搞一搞. 按左端点排序,左端点相同时按右端点排序. 如果是左端点就$ cnt++ $,否则$ cnt-- $ 统计一下$ Max $就行了 代码 #include & ...

  9. UVaLive 3905 Meteor (扫描线)

    题意:给定上一个矩形照相机和 n 个流星,问你照相机最多能拍到多少个流星. 析:直接看,似乎很难解决,我们换一个思路,我们认为流星的轨迹就没有用的,我们可以记录每个流星每个流星在照相机中出现的时间段, ...

随机推荐

  1. canvas之背景特效

    需具备js基础知识以及canvas相关方法(可查阅相关文档) 下面是一篇有关js与canvas的背景特效 基于面向过程的思维 <!DOCTYPE html> <html> &l ...

  2. MySQL的JOIN用法

    JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. CREATE TABLE t_blog( i ...

  3. 关于php中数字0与其他变量的相等判断

    在实践过程中,经常需要做`==`判断,有时候会把0当做false一样用,但是0和false在用来做比较的时候还是不一样的, false false==0 等于true false=='0' 等于tru ...

  4. Product Helper

    using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; /// <summary> /// 产品 ...

  5. Apache Flume简介及安装部署

    概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume 的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目 ...

  6. Python编程从入门到实践,个人笔记

    3-9 晚餐嘉宾:在完场练习3-6时编写的程序之一中,使用len()打印一条消息,指出有多少位嘉宾来与你共进晚餐. 自己先写的程序如下: # coding=gbk #邀请一些人吃饭 per_list= ...

  7. django创建第一个django项目-2

    安装django 虚拟环境下执行命令: pip install django==1.11.11 查看是否安装成功 pip list 列表中有django说明安装成功 创建工程 命令行移动到想要创建项目 ...

  8. python三大神器之装饰器

    装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: import time def func1(): print('in func1') def timer(func): def in ...

  9. NOI2002银河英雄传说-带权并查集

    [NOI2002]银河英雄传说-带权并查集 luogu P1196 题目描述 Description: 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年, ...

  10. springboot之redis的应用

    1.redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted se ...