[BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)
4822: [Cqoi2017]老C的任务
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 379 Solved: 203
[Submit][Status][Discuss]Description
老 C 是个程序员。最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统。作为经验丰富的程序员,老 C 轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现。由于一个基站的面积相对于整个城市面积来说非常的小,因此每个的基站都可以看作坐标系中的一个点,其位置可以用坐标(x, y)来表示。此外,每个基站还有很多属性,例如高度、功率等。运营商经常会划定一个区域,并查询区域中所有基站的信息。现在你需要实现的功能就是,对于一个给定的矩形区域,回答该区域中(包括区域边界上的)所有基站的功率总和。如果区域中没有任何基站,则回答 0。Input
第一行两个整数 n, m,表示一共有n个基站和m次查询。接下来一共有 n 行,每行由x_i , y_i , p_i 三个空格隔开的整数构成,表示一个基站的坐标(x_i , y_i )和功率p_i 。不会有两个基站位于同一坐标。接下来一共有m行,每行由x1_j , y1_j , x2_j , y2_j 四个空格隔开的整数构成,表示一次查询的矩形区域。该矩形对角坐标为(x1_j , y1_j )和(x2_j , y2_j ),且 4 边与坐标轴平行。2^31 ≤ x_i , y_i , p_i , x1_j , y1_j , x2_j , y2_j < 2^31, x1_j ≤ x2_j, y1_j ≤ y2_j。Output
输出 m 行,每行一个整数,对应每次查询的结果。Sample Input
4 2
0 0 1
0 1 2
2 2 4
1 0 8
0 0 1 1
1 1 5 6Sample Output
11
4HINT
Source
第一眼离散化+二维树状数组,但是显然空间开不下。
那么直接把每个矩形拆成两条边,离线后扫描线+树状数组就好了。
感觉对于区间问题比较常用的几个:主席树,扫描线,CDQ分治,莫队。
没排序调了半天。。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define find(x) lower_bound(b+1,b+tot+1,x)-b
typedef long long ll;
using namespace std; const int N=;
ll p[N],c[N<<],ans[N];
int n,m,tot,cnt,x[N],y[N],x1[N],y1[N],x2[N],y2[N],b[N<<];
struct P{ int x,y; ll p; }pt[N<<];
struct Q{ int x,l,r,pos; }q[N<<];
bool operator <(P a,P b){ return a.x<b.x; }
bool operator <(Q a,Q b){ return a.x<b.x; } void add(int x,ll k){ for (; x<=tot; x+=x&-x) c[x]+=k; }
ll que(int x){ ll res=; for (; x; x-=x&-x) res+=c[x]; return res; } int main(){
freopen("task.in","r",stdin);
freopen("task.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,n) scanf("%d%d%lld",&x[i],&y[i],&p[i]),b[++tot]=x[i],b[++tot]=y[i];
rep(i,,m){
scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);
b[++tot]=x1[i]-; b[++tot]=y1[i]-; b[++tot]=x2[i]; b[++tot]=y2[i];
}
sort(b+,b+tot+); tot=unique(b+,b+tot+)-b-;
rep(i,,n) x[i]=find(x[i]),y[i]=find(y[i]),pt[i]=(P){x[i],y[i],p[i]};
rep(i,,m){
x1[i]=find(x1[i]-); y1[i]=find(y1[i]-);
x2[i]=find(x2[i]); y2[i]=find(y2[i]);
q[++cnt]=(Q){x1[i],y1[i],y2[i],i}; q[++cnt]=(Q){x2[i],y1[i],y2[i],i};
}
sort(pt+,pt+n+); sort(q+,q+cnt+); int now=;
rep(i,,cnt){
while (pt[now].x<=q[i].x && now<=n) add(pt[now].y,pt[now].p),now++;
if (!ans[q[i].pos]) ans[q[i].pos]=que(q[i].r)-que(q[i].l);
else ans[q[i].pos]=que(q[i].r)-que(q[i].l)-ans[q[i].pos];
}
rep(i,,m) printf("%lld\n",ans[i]);
return ;
}
[BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)的更多相关文章
- FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
- 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组
题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组
[BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...
- 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组
[BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
随机推荐
- 【BZOJ】1588: [HNOI2002]营业额统计
[算法]平衡树(treap)||双向链表 [题解]treap知识见数据结构. #include<cstdio> #include<algorithm> #include< ...
- BTA 常问的 Java基础40道常见面试题及详细答案(山东数漫江湖))
八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动装箱,常量池 Object有哪些公用方法 Java的四种引用,强弱软虚,用到 ...
- poj 1837 Balance(背包)
题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- go环境变量及build文件
package main /* windows go环境设置: # 参考:https://blog.csdn.net/quicmous/article/details/80360126 GOROOT ...
- [Leetcode Week14]Path Sum II
Path Sum II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/path-sum-ii/description/ Description Giv ...
- otg device id pin 探討
Platform : Qualcomm MSM8937 PMIC : Qualcomm PMI8940 OTG base on USB2.0,增加 device 可當 host 也可當 periphe ...
- selenium===selenium自动化添加日志(转)
本文转自 selenium自动化添加日志 于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.p ...
- linux 系统调用fork()
头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (pid_t 是一个宏定义,其实质 ...
- MyBatis根据数组、集合查询
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.it ...
- Oracle事务处理
原文转自:(http://www.cnblogs.com/ITtangtang/archive/2012/04/23/2466554.html) 一.事务概念事务用于保证数据的一致性,它由一组相关的d ...