题目链接

题目

题目描述

​ Forsaken现在在一个三维空间中,空间中每个点都可以用 \((x,y,z)\) 表示。突然,三维空间的主人出现了,如果Forsaken想要继续在三维空间中呆下去,他就必须回答三维空间主人的问题。

​ 主人会在空间中坐标为 \((x,y,z)\) 处加一点能量值,当他加了一定的次数之后,他会问Forsaken一个问题:如果坐标 \((0,0,0)\) 为球心,那么至少需要多大的半径才能使得球内的能量值总和大于或者等于 \(k\) ,在这里,半径为 \(0\) 也是可以的。这对于Forsaken来说实在是太难了,因此他把这个问题交给了你。

输入描述

第一行一个 \(n\) 表示操作的次数。

接下来每行首先一个整数 \(op\) 表示操作的种类。

如果 \(op = 1\) ,接下来 \(3\) 个整数 \(x,y,z\) 表示能量值增加的坐标。

如果 \(op =2\) ,接下来一个整数 \(k\) 表示要求的能量值总和。

输出描述

对于每个 \(op=2\) 的操作,输出一个整数表示球的半径。(数据保证至少有一个 \(2\) 操作)

如果没有满足答案的半径,输出 \(-1\) 。

示例1

输入

2
1 1 1 1
2 1

输出

2

备注

\(1 \leq n \leq 2e5\)

\(1 \leq op \leq 2\)

\(-1e5 \leq x, y, z \leq 1e5\)

\(0\leq k \leq 2e5\)

题解

知识点:线段树,二分,计算几何。

很简单的一道线段树上二分,考虑以半径为轴建立线段树即可。

另外,需要注意点的半径位置虽然不一定是整数,但取上整后和原问题是等价的。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; struct T {
int sum;
static T e() { return { 0 }; }
friend T operator+(const T &a, const T &b) { return { a.sum + b.sum }; }
}; struct F {
int add;
T operator()(const T &x) { return { x.sum + add }; }
}; class SegmentTree {
int n;
vector<T> node; void update(int rt, int l, int r, int x, F f) {
if (r < x || x < l) return;
if (l == r) return node[rt] = f(node[rt]), void();
int mid = l + r >> 1;
update(rt << 1, l, mid, x, f);
update(rt << 1 | 1, mid + 1, r, x, f);
node[rt] = node[rt << 1] + node[rt << 1 | 1];
} int find(int rt, int l, int r, int val) {
if (l == r) return l;
int mid = l + r >> 1;
if (node[rt << 1].sum >= val) return find(rt << 1, l, mid, val);
else return find(rt << 1 | 1, mid + 1, r, val - node[rt << 1].sum);
} public:
SegmentTree(int _n = 0) { init(_n); } void init(int _n) {
n = _n;
node.assign(n << 2, T::e());
} void update(int x, F f) { update(1, 1, n, x, f); } int find(int val) {
if (val > node[1].sum) return -1;
if (val == 0) return 0;
return find(1, 1, n, val);
}
}; int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
SegmentTree sgt(2e5);
while (n--) {
int op;
cin >> op;
if (op == 1) {
int x, y, z;
cin >> x >> y >> z;
ll dist2 = 1LL * x * x + 1LL * y * y + 1LL * z * z;
int r = sqrt(dist2);
if (1LL * r * r < dist2) r++;
sgt.update(r, { 1 });
}
else {
int k;
cin >> k;
cout << sgt.find(k) << '\n';
}
}
return 0;
}

NC53370 Forsaken的三维数点的更多相关文章

  1. 牛客小白月赛18——Forsaken的三维数点

    这个是一个简单题,不过因为想到比标程时间复杂度更低的方法就尝试了一下. 思路:虽然加点是三维数点,但是我们要求的是半径的大小,这样的话,就可以转变为一维的问题. 标程的解法是,用树状数组维护,然后二分 ...

  2. 牛客小白月赛18 G Forsaken的三维数点

    思路: 这是一道树状数组和二分的题,用线段树空间直接爆,时间也会超 然后这道题我犯了一个很低级的错误,导致我wa了十发左右,一个int型变量用lld输入,然后他给的提示是运行错误,我哭了,我一直以为是 ...

  3. bzoj3295: [Cqoi2011]动态逆序对 三维数点

    为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ...

  4. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  5. 三维数点的CDQ分治板子

    int n, k, tot; struct _ {int x,r,f;} a[N]; struct __ { int type; ll x,y; bool operator < (const _ ...

  6. BZOJ1120 : [POI2009]STR

    因为问题的对称性,只需要考虑求出有多少点离$A$更近即可. 枚举$4$个绝对值的正负号,可以解出坐标范围. 若可以转化为二维数点,则可以统一扫描线+树状数组解决. 否则是三维数点,按一维排序,剩下两维 ...

  7. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  8. AI robots CodeForces - 1045G (cdq分治)

    大意: n个机器人, 位置$x_i$, 可以看到$[x_i-r_i,x_i+r_i]$, 智商$q_i$, 求智商差不超过$k$且能互相看到的机器人对数. 这个题挺好的, 关键是要求互相看到这个条件, ...

  9. JOISC2019 简要题解

    第18回 日本情報オリンピック 春合宿 オンラインコンテスト (JOISC2019) 官网 Day 1 試験 (Examination) description 有\(N\)个学生,每个学生有两科成绩 ...

  10. 洛谷P4396 [AHOI2013]作业(树套树)

    题意 题目链接 Sol 为什么一堆分块呀..三维数点不应该是套路离线/可持久化+树套树么.. 亲测树状数组套权值线段树可过 复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线) # ...

随机推荐

  1. Android之AMS原理分析

    在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到. 1 简述 ActivityManagerService是Android最核心的服务,负责管 ...

  2. SSM整合 - 环境配置

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  3. 今天是个好日子,TaxCore(POS软件)备案指北

    POS软件是什么?你好意思吗,还在用老掉牙的Winform. 关于POS 销售终端--POS(point of sale)是一种多功能终端,把它安装在信用卡的特约商户和受理网点中与计算机联成网络,就能 ...

  4. [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点

    https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(End Point),比如大家熟知的 OS.PFS.ORR 还有 DFS.TTP.TT ...

  5. [转帖]nginx配置文件中对于if条件语句的写法(附nginx跨域文件配置)

    前言 在nginx配置文件中,可以使用if语句,但是对于else语句其实是不支持的,并且and条件和or条件也是不支持的 实现 else条件的写法 新建一个开关变量flag,初始值为0,如果为1说明进 ...

  6. [转帖]一图胜千言 -- SQL Server 基准测试

    https://blog.51cto.com/ultrasql/2130487 文章标签基准测试文章分类SQL Server数据库阅读数1116  

  7. [转帖]Mnesia reports that this RabbitMQ cluster has experienced a network partition.

    一 问题描述 双节点RabbitMQ集群发生了脑裂,节点日志报错: [error] <0.6318.0> Mnesia(rabbit@pc2): ** ERROR ** mnesia_ev ...

  8. [转帖]三篇文章了解 TiDB 技术内幕 - 说存储

    https://cn.pingcap.com/blog/tidb-internal-1 引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层,是很多业务的 ...

  9. KylinV10升级部分软件的简单方法

    背景 2022-12-26有同事晚上在群里反馈客户现场的测试环境内存紧张. 我这边第一反应是进程重复了,导致内存使用量飙升. 告知现场使用 ps -ef |grep java |grep caf 发现 ...

  10. DM启动报错的处理: 达梦数据库启动实例时报错libgcc_s.so.1

    错误现象为: [root@CentOS8 opt]# /opt/dmdbms/bin/DmServiceDMSERVER startStarting DmServiceDMSERVER: libgcc ...