题目链接:BZOJ - 1218

题目分析

可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形。

坐标范围 <= 5000 ,直接 n^2 的二维前缀和,枚举每一个边长为 R - 1 的正方形就 AC 了 = =

但是,尽管 O(n^2) 的算法能水过,lct1999 神犇仍然坚持要写 O(n logn) 算法虐掉这道题,于是我 Orz 他也学着写了一下。

在神犇的讲解下,我写了这个算法:

首先将 n 个点按照 x 坐标排序,用一条竖直的扫描线,从左到右扫描每个点。

以这条扫描线为正方形的左边界,将在右边界之内的点都加入线段树,这个线段树是按照 y 坐标建立的。

我们应该求出的是 y 坐标的一个和最大的长度为 R 的区间,加入一个点或删除一个点会影响它所在的 R 个区间,这些区间是连续的一段,所以加点和删点就是区间修改。

又一次写区间修改不打标记,又一次被自己蠢哭了!

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. inline int gmax(int a, int b) {return a > b ? a : b;}
  11. inline int gmin(int a, int b) {return a < b ? a : b;}
  12.  
  13. const int MaxN = 10000 + 5;
  14.  
  15. int n, R, Ans, Head, Tail;
  16. int T[5000 * 4 + 15], D[5000 * 4 + 15];
  17.  
  18. struct Point
  19. {
  20. int x, y, w;
  21. bool operator < (const Point &b) const
  22. {
  23. return x < b.x;
  24. }
  25. } P[MaxN];
  26.  
  27. inline void Update(int x)
  28. {
  29. T[x] = gmax(T[x << 1], T[x << 1 | 1]);
  30. }
  31.  
  32. inline void Paint(int x, int Num)
  33. {
  34. D[x] += Num;
  35. T[x] += Num;
  36. }
  37.  
  38. inline void PushDown(int x)
  39. {
  40. if (D[x] == 0) return;
  41. Paint(x << 1, D[x]);
  42. Paint(x << 1 | 1, D[x]);
  43. D[x] = 0;
  44. }
  45.  
  46. inline void Add(int x, int s, int t, int l, int r, int Num)
  47. {
  48. if (l <= s && r >= t)
  49. {
  50. Paint(x, Num);
  51. return;
  52. }
  53. PushDown(x);
  54. int m = (s + t) >> 1;
  55. if (l <= m) Add(x << 1, s, m, l, r, Num);
  56. if (r >= m + 1) Add(x << 1 | 1, m + 1, t, l, r, Num);
  57. Update(x);
  58. }
  59.  
  60. int main()
  61. {
  62. scanf("%d%d", &n, &R);
  63. for (int i = 1; i <= n; ++i)
  64. scanf("%d%d%d", &P[i].x, &P[i].y, &P[i].w);
  65. sort(P + 1, P + n + 1);
  66. Head = 1; Tail = 0;
  67. Ans = 0;
  68. for (int i = 1; i <= n; ++i)
  69. {
  70. while (Head <= i && P[Head].x < P[i].x)
  71. {
  72. Add(1, 0, 5000, P[Head].y, gmin(5000, P[Head].y + R - 1), -P[Head].w);
  73. ++Head;
  74. }
  75. while (Tail < n && P[Tail + 1].x <= P[i].x + R - 1)
  76. {
  77. ++Tail;
  78. Add(1, 0, 5000, P[Tail].y, gmin(5000, P[Tail].y + R - 1), P[Tail].w);
  79. }
  80. Ans = gmax(Ans, T[1]);
  81. }
  82. printf("%d\n", Ans);
  83. return 0;
  84. }

  

[BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】的更多相关文章

  1. BZOJ 1218: [HNOI2003]激光炸弹 前缀DP

    1218: [HNOI2003]激光炸弹 Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值 ...

  2. BZOJ 1218: [HNOI2003]激光炸弹( 前缀和 + 枚举 )

    虽然source写着dp , 而且很明显dp可以搞...但是数据不大 , 前缀和 + 枚举也水的过去..... -------------------------------------------- ...

  3. bzoj 1218 [HNOI2003]激光炸弹 二维前缀和

    [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3022  Solved: 1382[Submit][Status][Di ...

  4. BZOJ 1218: [HNOI2003]激光炸弹(二维前缀和)

    Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置 ...

  5. bzoj 1218: [HNOI2003]激光炸弹

    思路:二维前缀和, 枚举矩形左上端点. #include<bits/stdc++.h> #define LL long long #define fi first #define se s ...

  6. 1218: [HNOI2003]激光炸弹

    1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1139  Solved: 542[Submit][Statu ...

  7. 【BZOJ】1218: [HNOI2003]激光炸弹(前缀和)

    题目 题目描述 输入输出格式 输入格式: 输入文件名为input.txt 输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ,vi . 输出格式: 输出文件名为 ...

  8. BZOJ 1645: [Usaco2007 Open]City Horizon 城市地平线 扫描线 + 线段树 + 离散化

    Code: #include<cstdio> #include<algorithm> #include<string> #define maxn 1030000 # ...

  9. bzoj1218: [HNOI2003]激光炸弹(DP二维前缀和)

    1218: [HNOI2003]激光炸弹 题目:传送门 题解: 一道经典题目啊... 为了更好的操作...把整个坐标系向右上角移动,从(1,1)开始 那么f[i][j]统计一下以(i,j)作为右上角, ...

随机推荐

  1. web安全培训笔记

    1.漏洞获取方法 1)扫描器扫描 2)乌云 3)线上服务漏洞 样例: 线上crm->管理员弱口令->后台上传头像处漏洞->上传php文件->进入内网->扫描内网拓扑-&g ...

  2. maven 学习1 -安装maven 并执行编译命令

    一.maven 下载与安装(安装好jdk的前提下) 1.下载地址:http://maven.apache.org/download.cgi  (选择最新的zip版本),下载完毕后解压 2.安装:系统p ...

  3. HDU2017JAVA

    字符串统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. Android开发之意图解析

     android中意图(intent)就是告诉系统要做某件事情.比如要拨打电话或者发送短信. 或者在一个Activity中点击按钮跳转到另外一个activity时也用到意图.意图分为两种:显示意图和隐 ...

  5. Linux Apache SVN

    yum install mod_dav_svn subversion  httpd mkdir /var/www/svnsvnadmin create /var/www/svn/puppetcd /v ...

  6. Android 5.0 全新的动画

    触摸反馈 ripple 触摸反馈是指用户在触摸控件时的一种可视化交互,在Android L之前,通常是通过press色变来凸显,但是因为是瞬间变化的效果,不如动画生动. 在Android L 中定义了 ...

  7. C#中方法的参数修饰符

    做项目久了,有的时候真的需要静下心来认真的总结一下自己所用到的技术,而不是每天依葫芦画瓢,每天忙忙碌碌,到头来不知道自己忙了个啥,学了什么,自己到底掌握了多少知识.所以我想回顾一下C#的基础知识,把重 ...

  8. 解读zookeeper的配置项

    zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:CS通信心跳数 Zoo ...

  9. Animating Layout Changes(展开收起)

    原文地址:https://developer.android.com/training/animation/layout.html#add (1)设置布局文件: <LinearLayout an ...

  10. ASCII 码表对照 2

    http://www.asciima.com/ ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的 ...