SPOJ BGSHOOT - Shoot and kill (线段树 区间修改 区间查询)
BGSHOOT - Shoot and kill
The problem is about Mr.BG who is a great hunter. Today he has gone to a dense forest for hunting and killing animals.
Sadly, he has only one bullet in his gun. He wants to kill as many animals as possible with only one bullet.
He has already known the information of duration availability of all animals of the forest.
So, he is planning to shoot at a time so that he could kill maximum animal.
Input
Input begins with an integer N denoting total numbers of animals.
Next N lines contains the duration of availability of animal denoting by X (Starting time) and Y (Ending time) .
Then, there will be Q, denoting the total numbers of queries to be answer.
Each query giving two integer L and R, L denoting the time hunter will come to forest and begins shooting
and R denoting last time upto which he will stay at forest for hunting.
Output
For each query output an integer denoting maximum numbers of animals he could kill by shooting at a time during L and R (inclusive).
Constraints:
1<=N,Q<=100000
1<=X,Y,L,R<=1000000000
Example
Input:
4
1 2
2 3
4 5
6 7
4
1 5
2 3
4 7
5 7 Output:
2
2
1
1
【分析】某人狩猎,在一条直线上,在时间区间[l,r]上会出现一只猎物,有这样的n个区间。这个人只有一支箭,所以只能射一次,由于所有猎物都在一条直线上,
所以在同一时刻出现的猎物可以同时被射死。然后给你q次询问,每次 询问给出一个区间,问在此区间内这个人用一支箭最多可以射死多少只猎物。
这就是个区间覆盖问题,求某一整数点最多覆盖多少区间。这就可以用线段树来做了,几乎模板题。记得离散化。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define inf 100000000
#define met(a,b) memset(a,b,sizeof a)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
using namespace std;
const int N = 4e5+;
const int M = 4e5+;
int n,sum[*N],m;
int lazy[*N];
int num[N*];
int ql[N*],qr[N*];
map<int,int>mp;
struct man{
int l,r;
}a[N*];
void pushup(int pos){
sum[pos]=max(sum[pos*],sum[pos*+]);
}
void pushdown(int pos){
if(lazy[pos]){
lazy[pos*]+=lazy[pos];lazy[pos*+]+=lazy[pos];
sum[pos*]+=lazy[pos];
sum[pos*+]+=lazy[pos];
lazy[pos]=;
}return;
} void update(int L,int R,int val,int l,int r,int pos) {
if(l>=L&&r<=R) {
lazy[pos]+=val;
sum[pos]+=val;
return;
}
int mid=(l+r)>>;
pushdown(pos);
if(L<=mid) update(L,R,val,l,mid,pos<<);
if(mid<R)update(L,R,val,mid+,r,pos<<|);
pushup(pos);
}
int query(int L,int R,int l,int r,int pos) {
if(l>=L&&r<=R){
return sum[pos];
}
int mid=(l+r)>>;
pushdown(pos);
int ans=;
if(L<=mid) ans=max(query(L,R,l,mid,pos<<),ans);
if(R>mid) ans=max(query(L,R,mid+,r,pos<<|),ans);
return ans;
}
int main() {
int ll,rr,cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].l,&a[i].r);
num[cnt++]=a[i].l;
num[cnt++]=a[i].r;
}
scanf("%d",&m);
for(int i=;i<m;i++){
scanf("%d%d",&ql[i],&qr[i]);
num[cnt++]=ql[i];
num[cnt++]=qr[i];
}
sort(num,num+cnt);
int all=;
for(int i=;i<cnt;i++)if(!mp[num[i]])mp[num[i]]=++all;
for(int i=;i<=n;i++)update(mp[a[i].l],mp[a[i].r],,,all,);
for(int i=;i<m;i++){
printf("%d\n",query(mp[ql[i]],mp[qr[i]],,all,));
}
return ;
}
SPOJ BGSHOOT - Shoot and kill (线段树 区间修改 区间查询)的更多相关文章
- [线段树]区间修改&区间查询问题
区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...
- SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)
GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...
- Hdu 1698(线段树 区间修改 区间查询)
In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...
- A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询
//add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点) // #include <cstdio> #include <cstring> #includ ...
- Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)
题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- codevs 1690 开关灯 线段树区间更新 区间查询Lazy
题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...
- 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)
Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...
随机推荐
- JS容易理解错误的地方
在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {}; 2 function sayHello(hi) ...
- Codeforces Round #535 (Div. 3) 题解
Codeforces Round #535 (Div. 3) 题目总链接:https://codeforces.com/contest/1108 太懒了啊~好久之前的我现在才更新,赶紧补上吧,不能漏掉 ...
- idea 从远程仓库导入git项目
File--new --Project from vision control -- git 输入远程仓库地址 即可.
- Extjs3.4 合并单元格
Ext3.4合并单元格 表格上添加grid-row-span样式
- linux基础——文件的压缩解压缩以及vim编辑
一.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/{passwd,group} > /1.txt 查看:cat /1.txt 二. ...
- zabbix ZBX_NOTSUPPORTED: Timeout while executing a shell script.
有一个监控一直都是正常的,今天突然收到报警邮件,上服务器查看服务又是正常的,但是报警邮件还是没恢复 监控端进行脚本测试,发现是正常的 到监控端使用zabbix_get -s ip -p 端口 -k ...
- PoI导出列表优化
针对写了头信息之后,使用for循环遍历会导致数据丢失问题的优化,使用迭代器替代for循环,具体如下: public static boolean ExportDeptLeaderFileToLocal ...
- 运行HelloWorld.class是报错(错误: 找不到或无法加载主类 HelloWorld.class)
1.从毕业到现在工作了几个月了,每天都是在写一些js代码,感觉作为一个web程序员,java还是十分重要的,于是自己买了一本java书来边学边练习,然后发现自己连使用记事本来编写的HelloWorld ...
- 只运行一个exe应用程序的使用案例
应用程序的exe启动设置 using System;using System.Diagnostics;using System.Reflection;using System.Runtime.Inte ...
- 【C++】嵌套类、友元
黄邦勇帅 里面关于嵌套类的介绍我有疑惑.里面11.9说在创建一个外围类的对象时先执行嵌套类的构造函数然后再执行外围类的构造函数,析构函数则以相反的方式执行. 可是我编程实验了一下,创建外围类对象时并不 ...