ACdream 1127 Base Station (离线查询+树状数组)
题目链接:
http://acdream.info/problem?pid=1127
题目:
移动通信系统中,通信网的建立主要通过基站来完成。
基站可以分为主基站和子基站。子基站和各个移动用户进行连接,子基站必须通过主基站来和外界实现通信。主基站可以覆盖到的范围是一个圆形区域,子基站和主基站的距离小于半径r才能被该主基站覆盖到。半径r由主基站的发射功率确定。
某个区域的移动通信网,包含2个主基站和N个子基站。它们的位置都可以对应到一个整数坐标上。如果子基站至少被一个主基站覆盖,则该子基站是激活的。
现在通信公司在调试设备,它们不停地改变主基站的发射功率,当两个主基站的覆盖半径分别为r1和r2时,需要知道有多少个子基站处于非激活状态。
题解:
对坐标进行转化,子基站对到主基站1(x1,y1)的距离转化为X轴,子基站对到主基站2(x2,y2)的距离转化为Y轴。然后对( 子基站到主基站2(x2,y2)的距离和主基站2的覆盖半径) 进行离散化处理。
然后按X轴进行降序排序,最后将Y轴插入到树状数组中进行维护和离线查询就行了。
复杂度:\(O(m*logn)\)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;
const int mod = 1e9+7;
struct node
{
int x,y;
int id;
bool operator < (const node &a) {
return (x == a.x && id < a.id) || (x > a.x);
}
}node[maxn];
int num[maxn];
int ans[maxn];
map<int,int>mp;
int sum[maxn];
int k;
void update(int pos,int val){
// std::cout << "k=" << k << '\n';
while(pos<=k)
{
sum[pos]+=val;
pos += (pos&-pos);
}
}
int query(int pos) {
int res = 0;
while(pos)
{
res += sum[pos];
pos -= (pos&-pos);
}
return res;
}
double distance(double x1,double y1,double x2,double y2)
{
return (double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(int argc, char const *argv[]) {
int x1,x2,y1,y2;
int n,m,x,y;
while(std::cin >> x1 >> y1 >> x2 >> y2)
{
mp.clear();
k = 0;
std::cin >> n;
for(int i=1;i<=n;i++) {
std::cin >> x >> y;
node[i].x = (int)distance(x,y,x1,y1);
node[i].y = (int)distance(x,y,x2,y2);
node[i].id = -i;
num[k++] = node[i].y;
}
std::cin >> m;
for(int i=1;i<=m;i++) {
std::cin >> node[i+n].x >> node[i+n].y;
node[i+n].id = i;
num[k++] = node[i+n].y;
}
sort(num,num+k);
k = unique(num,num+k)-num;
for(int i=0;i<k;i++) {
mp[num[i]] = i+1;
}
sort(node+1,node+n+m+1);
memset(sum,0,sizeof( sum ));
for(int i=1;i<=n+m;i++) {
int pos = mp[node[i].y];
// std::cout << "now= " <<node[i].x<<" "<< node[i].y <<" " << node[i].id<<" " << pos << '\n';
if(node[i].id < 0) {
update(pos,1);
}
else if(node[i].id >= 1){
ans[node[i].id] = query(k) - query(pos-1);
}
}
for(int i=1;i<=m;i++) {
std::cout << ans[i] << '\n';
}
}
// cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
return 0;
}
ACdream 1127 Base Station (离线查询+树状数组)的更多相关文章
- HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...
- BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组
题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...
- hdu-3333 Turing Tree 离线区间+树状数组(区间不同数的和)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 题目大意: 给出一数组,以及m个查询区间,每次查询该区间不同数字的和.相同数字只加一次. 解题 ...
- [CF369E]Valera and Queries_离线_树状数组
Valera and Queries 题目链接:codeforces.com/problemset/problem/369/E 数据范围:略. 题解: 这种题,就单独考虑一次询问即可. 我们发现,包括 ...
- bzoj3529(莫比乌斯反演+离线+树状数组)
在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌. 看来我并没有理解到acmicpc比赛的宗旨啊. 这么多次查询可以考虑离线操作,使用树状数组单点更新. /***** ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- HDU 4638 Group (2013多校4 1007 离线处理+树状数组)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- caioj 1063 动态规划入门(一维一边推1:美元和马克)
这道题一开始我是这么想的 最后的答案肯定是某次的马克换回来的,但这个该怎么确定?? 实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系. 可以发现,只有两种可能,最后一天换或者不换.换的话就 ...
- Linux学习总结(2)——linux常用命令大全
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...
- 參考mudo logging写的win下logging
#pragma once #include <boost/noncopyable.hpp> #include <boost/scoped_ptr.hpp> #include & ...
- linux命令行学习-dig(DNS查询器)
在web开发中.总要熟悉的就是http协议.而发起一个http開始前最先要经历的一个过程就是DNS解析.简单说就是域名怎样终于解析到实际serverip的过程. 而在研究DNS解析和排除DNS解析类故 ...
- .Net中常用的几种ActionResult
1.ViewResult 表示一个视图结果,它根据视图模板产生应答内容.对应得Controller方法为View. 2.PartialViewResult 表示一个部分视图结果,与ViewResult ...
- SQLite详解,案例,手册
SQLite 存储类型 1.NULL 2.INTEGER 3.REAL 4.TEXT 5.BLOB 创建表 CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT N ...
- Android 学习笔记进阶14之像素操作
在我们玩的游戏中我们会经常见到一些图像的特效,比如半透明等效果.要实现这种半透明效果其实并不难,需要我们懂得图像像素的操作. 不要怕,其实在Android中Bitmap为我们提供了操作像素的基本方法. ...
- 小白算法之路-非确定性多项式(non-deterministic polynomial,缩写NP)
前端小白的算法之路 时隔多日终于解决了埋在心头的一道难题,霎时云开雾散,今天把一路而来碰到的疑惑和心得都记录下来,也算是开启了自己探索算法的大门. 问题背景 曾经有一个年少轻狂的职场小白,在前端圈 ...
- js -- canvas img 封装
鼠标 1.操作canvas 中的 img. 右键放大缩小,左键移动img. 2.拖动input type= range 改变图片的透明度 html 代码 <!DOCTYPE html> ...
- HDP和HDF
参考文档: HDP安装: 官方文档:https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.0.3/bk_ambari-installation/co ...