ZOJ-3597-Hit the Target!(线段树+扫描线)
题解引自: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,则重叠的部分职能算一次,因为每把枪只能打一个靶子
- // File Name: 3597.cpp
- // Author: Zlbing
- // Created Time: 2013/7/21 14:25:06
- #include<iostream>
- #include<string>
- #include<algorithm>
- #include<cstdlib>
- #include<cstdio>
- #include<set>
- #include<map>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<cmath>
- #include<queue>
- using namespace std;
- #define CL(x,v); memset(x,v,sizeof(x));
- #define INF 0x3f3f3f3f
- #define LL long long
- #define REP(i,r,n) for(int i=r;i<=n;i++)
- #define RREP(i,n,r) for(int i=n;i>=r;i--)
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- const int MAXN=5e4+;
- struct point{
- int x,y;
- bool operator <(const point& rsh)const{
- if(y==rsh.y)return x<rsh.x;
- else return y<rsh.y;
- }
- }G[];
- int sum[MAXN<<];
- int col[MAXN<<];
- void pushup(int rt)
- {
- sum[rt]=max(sum[rt<<],sum[rt<<|]);
- }
- void pushdown(int rt)
- {
- if(col[rt])
- {
- sum[rt<<]+=col[rt];
- sum[rt<<|]+=col[rt];
- col[rt<<]+=col[rt];
- col[rt<<|]+=col[rt];
- col[rt]=;
- }
- }
- void update(int L,int R,int flag,int l,int r,int rt)
- {
- if(L<=l&&R>=r)
- {
- col[rt]+=flag;
- sum[rt]+=flag;
- return;
- }
- pushdown(rt);
- int m=(l+r)>>;
- if(L<=m)update(L,R,flag,lson);
- if(R>m)update(L,R,flag,rson);
- pushup(rt);
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- int n,m,p,q,K;
- scanf("%d%d%d%d",&n,&m,&p,&q);
- scanf("%d",&K);
- for(int i=;i<K;i++)
- {
- scanf("%d%d",&G[i].y,&G[i].x);
- }
- sort(G,G+K);
- int ans=;
- int j=,k=;
- CL(sum,);
- CL(col,);
- for(int i=;i+p-<=n;i++)
- {
- for(;G[j].y-i<p&&j<K;j++)
- {
- if(j+<K&&G[j].y==G[j+].y&&G[j+].x-G[j].x<q)
- update(G[j].x,G[j+].x-,,,m,);
- else
- update(G[j].x,min(m,G[j].x+q-),,,m,);
- }
- ans+=sum[];
- for(;k<j&&G[k].y==i;k++)
- {
- if(k+<j&&G[k].y==G[k+].y&&G[k+].x-G[k].x<q)
- update(G[k].x,G[k+].x-,-,,m,);
- else
- update(G[k].x,min(m,G[k].x+q-),-,,m,);
- }
- }
- printf("%.2lf\n",(double)ans/(n-p+));
- }
- return ;
- }
ZOJ-3597-Hit the Target!(线段树+扫描线)的更多相关文章
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
随机推荐
- IE兼容问题
1.IE下event事件没有target属性,只有srcElement属性,解决方法:使用srcObj = event.srcElement ? event.srcElement : event.ta ...
- Axure RP 8.0正式版下载地址 安装和汉化说明
1.Axure RP和中文包包下载地址 官网地址:http://www.axure.com.cn/3510/ 2.下载完成后安装 3.破解 axure8.0注册码激活码:(亲测可用)用户名:aaa注册 ...
- Quartz.NET配置(Log4net)
最近有个任务关于服务调度,想起以前看过Quartz.NET调度任务非常棒. 今天小试Quartz.NET,前面配置Quartz.NET很轻松,控制台也输出了.但是想配合Log4net来做日志文件,怎么 ...
- eclipse-自动注释
在eclipse中自动添加'注释'的快捷键是'Alt+Shift+J',可以在 MyEclipse中的 Java->Code Style->Code Template->Commen ...
- linq学习笔记:将List<T> 转换为 Dictionary<T Key,T Value>
运用Linq,将List<T> 转换为 Dictionary<T Key,T Value> 即:List<T> ToDictionary<T Key,T V ...
- Convention插件的使用(会涉及content目录,jsp必须放入这个下面才能映射成功基于注解的配置)
http://blog.csdn.net/zclandzzq/article/details/7107816
- C#中邮件的发送基本操作
本地配置的邮箱:http://localhost:6080/index.php //邮件的收发需要用到两个类 //1.用来创建一封邮件对象 //1.MailMessage 添加对 usin ...
- 【原创】ZeroClipboard的时代或许已经过去了
曾经,一个网页上要用Javascript实现网页内容的复制,其实是很麻烦的一件事情.虽然在这个问题上IE有其高大上的 window.clipboardData 方法支持直接复制指定内容,Firefox ...
- 原生JS判断密码强弱
前些天工作中有这个需求,自己手写了相关的JS代码,第一种方法是通过ASCII 码判断密码类型,完成用户注册时判断用户输入密码的强度,分强.弱.中三等级,它可以根据用户输入的密码显示对应的密码强弱等级, ...
- Spring 中的注解
1.普通方式注解 a.在配置文件中配置 1.导入命名空间 xmlns:context="http://www.springframework.org/schema/ ...