题解引自:http://www.cnblogs.com/wuyiqi/archive/2012/04/28/2474614.html

这题和着题解一块看,看了半天才看懂的....菜菜....

题意:有一排的枪编号依次为1~n 有一排靶子编号依次为1~m

告诉你哪些枪能打中哪些靶子,然后如果每次只能选连续的P把枪,连续的Q个靶子,每次能打中的靶子的最大值为多少

答案是把每次打中的最大值相加再除以总的次数

即选择 1~P 的枪能打中的最多的靶子的数量 + 2~p+1 的枪能打中的最多的靶子的数量 +。。。n-p+1~n的枪能打中的最多的靶子的数量 /(n-p+1)

注意,每把枪最多只能打一个靶子

解法:将题目中的关系转换为坐标 以枪为纵坐标 a 能打中 b ,在坐标系中为(b,a),然后连续的P把枪和连续的Q个靶子则可以表示为

用一个P x Q的矩形去覆盖,最多能覆盖的总的点数,就是poj 2482 了,但要注意一点,如果两根同一高度的水平线的距离小于Q,则重叠的部分职能算一次,因为每把枪只能打一个靶子

  1. // File Name: 3597.cpp
  2. // Author: Zlbing
  3. // Created Time: 2013/7/21 14:25:06
  4.  
  5. #include<iostream>
  6. #include<string>
  7. #include<algorithm>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. #include<set>
  11. #include<map>
  12. #include<vector>
  13. #include<cstring>
  14. #include<stack>
  15. #include<cmath>
  16. #include<queue>
  17. using namespace std;
  18. #define CL(x,v); memset(x,v,sizeof(x));
  19. #define INF 0x3f3f3f3f
  20. #define LL long long
  21. #define REP(i,r,n) for(int i=r;i<=n;i++)
  22. #define RREP(i,n,r) for(int i=n;i>=r;i--)
  23.  
  24. #define lson l,m,rt<<1
  25. #define rson m+1,r,rt<<1|1
  26.  
  27. const int MAXN=5e4+;
  28. struct point{
  29. int x,y;
  30. bool operator <(const point& rsh)const{
  31. if(y==rsh.y)return x<rsh.x;
  32. else return y<rsh.y;
  33. }
  34. }G[];
  35.  
  36. int sum[MAXN<<];
  37. int col[MAXN<<];
  38.  
  39. void pushup(int rt)
  40. {
  41. sum[rt]=max(sum[rt<<],sum[rt<<|]);
  42. }
  43. void pushdown(int rt)
  44. {
  45. if(col[rt])
  46. {
  47. sum[rt<<]+=col[rt];
  48. sum[rt<<|]+=col[rt];
  49. col[rt<<]+=col[rt];
  50. col[rt<<|]+=col[rt];
  51. col[rt]=;
  52. }
  53. }
  54. void update(int L,int R,int flag,int l,int r,int rt)
  55. {
  56. if(L<=l&&R>=r)
  57. {
  58. col[rt]+=flag;
  59. sum[rt]+=flag;
  60. return;
  61. }
  62. pushdown(rt);
  63. int m=(l+r)>>;
  64. if(L<=m)update(L,R,flag,lson);
  65. if(R>m)update(L,R,flag,rson);
  66. pushup(rt);
  67. }
  68. int main()
  69. {
  70. int T;
  71. scanf("%d",&T);
  72. while(T--)
  73. {
  74. int n,m,p,q,K;
  75. scanf("%d%d%d%d",&n,&m,&p,&q);
  76. scanf("%d",&K);
  77. for(int i=;i<K;i++)
  78. {
  79. scanf("%d%d",&G[i].y,&G[i].x);
  80. }
  81. sort(G,G+K);
  82. int ans=;
  83. int j=,k=;
  84. CL(sum,);
  85. CL(col,);
  86. for(int i=;i+p-<=n;i++)
  87. {
  88.  
  89. for(;G[j].y-i<p&&j<K;j++)
  90. {
  91. if(j+<K&&G[j].y==G[j+].y&&G[j+].x-G[j].x<q)
  92. update(G[j].x,G[j+].x-,,,m,);
  93. else
  94. update(G[j].x,min(m,G[j].x+q-),,,m,);
  95. }
  96. ans+=sum[];
  97. for(;k<j&&G[k].y==i;k++)
  98. {
  99. if(k+<j&&G[k].y==G[k+].y&&G[k+].x-G[k].x<q)
  100. update(G[k].x,G[k+].x-,-,,m,);
  101. else
  102. update(G[k].x,min(m,G[k].x+q-),-,,m,);
  103. }
  104. }
  105. printf("%.2lf\n",(double)ans/(n-p+));
  106. }
  107. return ;
  108. }

ZOJ-3597-Hit the Target!(线段树+扫描线)的更多相关文章

  1. ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)

    ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...

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

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

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

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

  4. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  5. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  6. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  7. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

  8. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  9. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

随机推荐

  1. IE兼容问题

    1.IE下event事件没有target属性,只有srcElement属性,解决方法:使用srcObj = event.srcElement ? event.srcElement : event.ta ...

  2. Axure RP 8.0正式版下载地址 安装和汉化说明

    1.Axure RP和中文包包下载地址 官网地址:http://www.axure.com.cn/3510/ 2.下载完成后安装 3.破解 axure8.0注册码激活码:(亲测可用)用户名:aaa注册 ...

  3. Quartz.NET配置(Log4net)

    最近有个任务关于服务调度,想起以前看过Quartz.NET调度任务非常棒. 今天小试Quartz.NET,前面配置Quartz.NET很轻松,控制台也输出了.但是想配合Log4net来做日志文件,怎么 ...

  4. eclipse-自动注释

    在eclipse中自动添加'注释'的快捷键是'Alt+Shift+J',可以在 MyEclipse中的 Java->Code Style->Code Template->Commen ...

  5. linq学习笔记:将List<T> 转换为 Dictionary<T Key,T Value>

    运用Linq,将List<T> 转换为 Dictionary<T Key,T Value> 即:List<T>  ToDictionary<T Key,T V ...

  6. Convention插件的使用(会涉及content目录,jsp必须放入这个下面才能映射成功基于注解的配置)

    http://blog.csdn.net/zclandzzq/article/details/7107816

  7. C#中邮件的发送基本操作

    本地配置的邮箱:http://localhost:6080/index.php //邮件的收发需要用到两个类   //1.用来创建一封邮件对象     //1.MailMessage 添加对 usin ...

  8. 【原创】ZeroClipboard的时代或许已经过去了

    曾经,一个网页上要用Javascript实现网页内容的复制,其实是很麻烦的一件事情.虽然在这个问题上IE有其高大上的 window.clipboardData 方法支持直接复制指定内容,Firefox ...

  9. 原生JS判断密码强弱

    前些天工作中有这个需求,自己手写了相关的JS代码,第一种方法是通过ASCII 码判断密码类型,完成用户注册时判断用户输入密码的强度,分强.弱.中三等级,它可以根据用户输入的密码显示对应的密码强弱等级, ...

  10. Spring 中的注解

    1.普通方式注解 a.在配置文件中配置 1.导入命名空间              xmlns:context="http://www.springframework.org/schema/ ...