ZOJ 3597

题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你被允许选择一个连续的Q个靶子,使得这P把枪所打到的靶子的数目最多,问打到的靶子数目的期望值是多少。

这题通过简单的转化就可以转换成为另一个模型:

如果第a把枪可以打到第b个靶子,那么将其视为二位平面上的一个点(b, a), 问题转化为一个Q * P的矩形最多可以覆盖多少个点。只是有一点需要注意的就是同一把枪只能打到一个靶子,所以在a相等的情况下最多只能覆盖一个b。

至于如何求矩形覆盖点的个数,我这也是第一次写,所以查阅了有关资料。

方法是将矩形的右界作为参考点,找出参考点在哪一个区间(线段)内矩形都可以覆盖到这个点,这样每一个点就对应y相等的一段线段,原题就转化成为了高度y小于P的区间内某一个位置x上的覆盖次数的最大值,可以用线段树的离线操作(扫描线)来完成。

  1. #include <map>
  2. #include <set>
  3. #include <stack>
  4. #include <queue>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <vector>
  8. #include <cstdio>
  9. #include <cctype>
  10. #include <cstring>
  11. #include <cstdlib>
  12. #include <iostream>
  13. #include <algorithm>
  14. using namespace std;
  15. #define INF 0x3f3f3f3f
  16. #define inf (-((LL)1<<40))
  17. #define lson k<<1, L, (L + R)>>1
  18. #define rson k<<1|1, ((L + R)>>1) + 1, R
  19. #define mem0(a) memset(a,0,sizeof(a))
  20. #define mem1(a) memset(a,-1,sizeof(a))
  21. #define mem(a, b) memset(a, b, sizeof(a))
  22. #define FIN freopen("in.txt", "r", stdin)
  23. #define FOUT freopen("out.txt", "w", stdout)
  24. #define rep(i, a, b) for(int i = a; i <= b; i ++)
  25.  
  26. template<class T> T CMP_MIN(T a, T b) { return a < b; }
  27. template<class T> T CMP_MAX(T a, T b) { return a > b; }
  28. template<class T> T MAX(T a, T b) { return a > b ? a : b; }
  29. template<class T> T MIN(T a, T b) { return a < b ? a : b; }
  30. template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
  31. template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b; }
  32.  
  33. //typedef __int64 LL;
  34. typedef long long LL;
  35. const int MAXN = ;
  36. const int MAXM = ;
  37. const double eps = 1e-;
  38. //LL MOD = 987654321;
  39.  
  40. #define OK(i) (i > 0 && p[i - 1].y == p[i].y && p[i].x <= p[i - 1].x + Q - 1)
  41.  
  42. int T, N, M, P, Q, K;
  43. struct Point {
  44. int x, y;
  45. bool operator < (const Point &A) const {
  46. return y == A.y ? x < A.x : y < A.y;
  47. }
  48. }p[MAXM];
  49.  
  50. struct SegTree {
  51. LL ma[MAXN<<], add[MAXN<<];
  52.  
  53. void build(int k, int L, int R) {
  54. ma[k] = add[k] = ;
  55. if(L == R) return ;
  56. build(lson); build(rson);
  57. }
  58.  
  59. void pushDown(int k) {
  60. ma[k<<] += add[k]; add[k<<] += add[k];
  61. ma[k<<|] += add[k]; add[k<<|] += add[k];
  62. add[k] = ;
  63. }
  64.  
  65. void update(int k, int L, int R, int l, int r, int val) {
  66. if(R < l || L > r) return ;
  67. if(l <= L && R <= r) { ma[k] += val; add[k] += val; return ; }
  68. pushDown(k);
  69. update(lson, l, r, val);
  70. update(rson, l, r, val);
  71. ma[k] = max(ma[k<<], ma[k<<|]);
  72. }
  73.  
  74. LL query(int k, int L, int R, int l, int r) {
  75. if(R < l || L > r) return ;
  76. if(l <= L && R <= r) return ma[k];
  77. pushDown(k);
  78. return max(query(lson, l, r), query(rson, l, r));
  79. }
  80.  
  81. }segTree;
  82.  
  83. int main()
  84. {
  85. //FIN;
  86. while(~scanf("%d", &T)) while(T--)
  87. {
  88. scanf("%d %d %d %d %d", &N, &M, &P, &Q, &K);
  89. rep (i, , K - ) scanf("%d %d", &p[i].y, &p[i].x);
  90. sort(p, p + K);
  91.  
  92. segTree.build(, , M);
  93. LL ans = , fr = , re = ;
  94. rep (i, P, N) {
  95. while(fr < K && p[fr].y <= i) {
  96. int st = OK(fr) ? p[fr-].x + Q : p[fr].x;
  97. int ed = min(p[fr].x + Q - , M);
  98. segTree.update(, , M, st, ed, );
  99. fr ++;
  100. }
  101. while(i - p[re].y >= P) {
  102. int st = OK(re) ? p[re-].x + Q : p[re].x;
  103. int ed = min(p[re].x + Q - , M);
  104. segTree.update(, , M, st, ed, -);
  105. re ++;
  106. }
  107. ans += segTree.query(, , M, , M);
  108. }
  109. printf("%.2lf\n", (double)ans / (N - P + ));
  110. }
  111. return ;
  112. }

ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)的更多相关文章

  1. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  2. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  3. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...

  4. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  5. ZOJ-3597-Hit the Target!(线段树+扫描线)

    题解引自:http://www.cnblogs.com/wuyiqi/archive/2012/04/28/2474614.html 这题和着题解一块看,看了半天才看懂的....菜菜.... 题意:有 ...

  6. 【学习笔记】线段树—扫描线补充 (IC_QQQ)

    [学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...

  7. 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))

    扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...

  8. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

随机推荐

  1. linux修改文件夹及其子文件夹的权限

    加入-R 参数,就可以将读写权限传递给子文件夹例如chmod -R 777 /home/mypackage那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777.777是读.写.执行 ...

  2. kdtree备份

    库在这里 这个很好用. 例子: /*! gcc -Wall -g -o test test.c libkdtree.a */ #include <stdio.h> #include < ...

  3. C++ 编写Windows service

    最近实现一个windows server端守护进程启动服务功能(c++实现),遇到了一些问题,记录一下 1. 启动Service实现代码: int _tmain(int argc, TCHAR* ar ...

  4. unity, audio falloff

    要达到声音随距离衰减的效果,需要使用3D音效,即把Spatial Blend设为1,然后再调节Min Distance和Max Distance(蓝色线框球体),并选择合适的Volume Rollof ...

  5. MySQL与Oracle 差异比较之二基本语法

    基本语法 编号 类别 ORACLE MYSQL 注释 1 变量的声明方式不同 li_index NUMBER := 0 DECLARE li_index INTEGER DEFAULT 0 1. my ...

  6. SpatiaLite 各版本数据库差异

    SpatiaLite 生成的数据库,3.0版本与4.0版本的表geometry_columns结构发生变化. 这是3.0版本的结构: 这是4.0版本的结构: 主要差别是type和coord_dimen ...

  7. zz github配置

    First : 安装:ubuntu 下,终端输入命令: sudo apt-get install git-core git-gui git-doc Next : 设置SSH Key 检查是否已经有SS ...

  8. poj 2409(polya定理模板)

    题意:给你n种颜色和m个小球,问你有多少种不同的方案! 分析:作为模板.. 代码实现: #include <iostream> #include <cstdio> #inclu ...

  9. N元数组的子数组之和的最大值

    题目:有N个整数的元素的一维数组,求子数组中元素之和中最大的一组(思想:动态规划) 分析: 设该数组为array[N], 那么对于array[i]该不该在元素之和最大的那个子数组中呢?首先,不如假设a ...

  10. propertyGrid控件 z

    1.如果属性是enum类型,那么自然就是下拉的. 2.如果是你自定义的下拉数据,那么需要用到转换属性标签TypeConverter 参见: http://blog.csdn.net/luyifeini ...