【cf1046】A. AI robots(动态开点线段树)
题意:
坐标轴上有\(n\)个机器人,每个机器人带有属性\(x,r,q\),分别表示位置、可视半径以及智商。
现在定义智商相近为两个机器人的智商差的绝对值不超过$K。
现在问有多少对机器人,他们在互相的可视范围内并且智商相近。
思路:
一开始没注意到互相在对面的可视范围内,以为是主席树模板题。。。
- 注意到\(K\leq 20\),所以总的有用的智商值为\(40*n\)个。
- 那么我们可以采用动态开点的方法,对于每个智商值,储存存在的区间的位置,这样可以节约空间。
- 对于互相在对方可视范围内,可以先按\(r\)从大到小排序,然后依次处理,当前位置为\(x_i\),那么在\([x_i-r_i,x_i+r_i\)内的机器人都是合法的。
- 那么对于每个机器人,暴力每个智商值,查询在对应区间范围内的机器人个数即可。
时间复杂度约为\(O(nklogn)\),空间复杂度也因为动态开点优化到了\(O(nlogn)\)。
代码如下:
/*
* Author: heyuhhh
* Created Time: 2019/11/12 20:42:29
*/
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 1e5 + 25;
int n, k;
struct node{
int x, r, q;
bool operator < (const node &A) const{
return r > A.r;
}
}a[N];
unordered_map <int, int> mp;
int tot;
int rt[N * 35], ls[N * 35], rs[N * 35], sum[N * 35];
void upd(int &o, int l, int r, int p, int v) {
if(!o) o = ++tot;
if(l == r) {
sum[o] += v;
return;
}
int mid = (l + r) >> 1;
if(p <= mid) upd(ls[o], l, mid, p, v);
else upd(rs[o], mid + 1, r, p, v);
sum[o] = sum[ls[o]] + sum[rs[o]];
}
int query(int o, int l, int r, int L, int R) {
if(!o) return 0;
if(L <= l && r <= R) {
return sum[o];
}
int res = 0, mid = (l + r) >> 1;
if(L <= mid) res += query(ls[o], l, mid, L, R);
if(R > mid) res += query(rs[o], mid + 1, r, L, R);
return res;
}
void run(){
for(int i = 1; i <= n; i++) cin >> a[i].x >> a[i].r >> a[i].q;
sort(a + 1, a + n + 1);
ll ans = 0;
for(int i = 1; i <= n; i++) {
int l = max(0, a[i].x - a[i].r);
int r = a[i].x + a[i].r;
int L = max(0, a[i].q - k);
int R = a[i].q + k;
for(int j = L; j <= R; j++) {
if(mp.find(j) == mp.end()) continue;
ans += query(rt[mp[j]], 0, INF, l, r);
}
if(mp.find(a[i].q) == mp.end()) mp[a[i].q] = ++tot;
upd(rt[mp[a[i].q]], 0, INF, a[i].x, 1);
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
while(cin >> n >> k) run();
return 0;
}
【cf1046】A. AI robots(动态开点线段树)的更多相关文章
- CF1045G AI robots(动态开点线段树)
题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...
- [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- codeforces 915E - Physical Education Lessons 动态开点线段树
题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...
- CF915E Physical Education Lessons 动态开点线段树
题目链接 CF915E Physical Education Lessons 题解 动态开点线段树 代码 /* 动态开点线段树 */ #include<cstdio> #include&l ...
- 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)
题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
- NOIP2017 列队——动态开点线段树
Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 ...
- 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...
随机推荐
- oracle数据库修改密码有效期,解决ORA-28001: 口令已经失效
工作中oracle数据库安装完成后,需要修改默认的密码有效期,默认为180天,如果不修改,到期忘记更改密码可能会造成不必要的影响. 两种修改方式pl/sql或者cmd窗口 1.pl/sql修改默认密码 ...
- August 04th, 2019. Week 32nd, Sunday
Making peace with what you don't have, that's what it's all about. 人生在世,不如意者十之八九,保持平常心,命里无时莫强求. Ever ...
- goroutine并发之callback回调
玩玩 package main import ( "fmt" "strings" "sync" ) var wait sync.WaitGr ...
- C++ 虚函数的说明
虚函数的几点说明: 1. 当一个成员函数定义为虚函数时,其派生类中的同名函数也自动为虚函数.无论其是否添加了 virtual 关键字. 为了能良好的阅读代码,请加上. 2. 父类的虚函数,就是为了让子 ...
- OpenGL光照3:光源
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- c# 字符串中全角和半角字符互转
public class ConvertDBCAndSBC { /// <summary>半角转成全角 /// 半角空格32,全角空格12288 /// 其他字符半角33~126,其他字符 ...
- Python打包成exe文件很难?一分钟即可学会,并添加图标!
环境1.python 3.72.pyinstaller下载方式:2.1 python安装(略)2.2 安装pyinstaller打开DOS窗口输入以下命令:pip install pyinstalle ...
- Python笔记:设计模式之命令模式
命令模式,正如模式的名字一样,该模式中的不同操作都可以当做不同的命令来执行,可以使用队列来执行一系列的命令,也可以单独执行某个命令.该模式重点是将不同的操作封装为不同的命令对象,将操作的调用者与执行者 ...
- GO基础之变量的使用
Go语言:是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性. 一.基本类型 变量的声明:全局变量必须有关键字var var name [type] 指定数据 ...
- springboot服务的一些问题
一: springboot踩坑记--springboot正常启动但访问404; 1. spring boot的启动类不能直接放在main(src.java.main)这个包下面,把它放在有包的里面就可 ...