题目链接

题目

题目描述

​ 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. Ubuntu安装jdk的步骤

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. [转帖]tcp、http和socket的区别

    https://www.jianshu.com/p/88d69454bdde 一:tcp协议 tcp协议属于传输层协议(UDP也属于传输层协议,但是UDP协议是无状态的).建立一个TCP连接需要三次握 ...

  3. [转帖]360孵化奇安信科创板上市,IPO前清空股权赚37亿元分手费

      https://baijiahao.baidu.com/s?id=1666485645739027654&wfr=spider&for=pc 来源:IPO头条 来源:IPO头条原创 ...

  4. CentOS8 安装Oracle19c RPM的办法

    1. 下载相应的rpm包 我这边使用的主要有: -rw-r--r-- 1 root root 19112 Apr 5 15:13 compat-libcap1-1.10-7.el7.x86_64.rp ...

  5. IPMI的简单使用

    背景 公司一台十一年前的服务器砸到我手中,要重装CentOS7的操作系统. 本着不想进机房, 不想格式化U盘的想法, 想用BMC进行安装系统. 遇到的第一个问题是不知道密码. 询问之前的机器持有人,也 ...

  6. PG数据库异步流复制

    PG数据库异步流复制 背景说明 最近想进行一个数据库高可用课题的研究. 因为之前某种原因,这次选择的是PG数据库. 为了简单起见, 暂时采用PG异步流复制的场景. 这次仅是为了测试, 不考虑高可用绿色 ...

  7. DashBoard in k8s 简单使用

    DashBoard in k8s 简单使用 第一部分 拉取分发镜像 没办法的事情,公司网络实在是太垃圾了, dockerhub 又不让多次docker pull 找一台网络表好的机器 执行如下命令: ...

  8. OpenPower服务使用node-exporter prometheus以及grafana进行性能监控的流程

    OpenPower服务器性能监控操作流程 1. 前言 最近看了很多prometheus以及influxdb进行性能监控的帖子,简单学习了下influxdb是一个单纯的时序数据库,prometheus是 ...

  9. 30岁程序媛求职路复盘:文转码+失业半年+PHP如何涨薪5K!?

    这篇文章来自一位群友的分享: 这篇文章写于下班路上,刚刚入职不久,我想再冲刺一下大厂,阳哥建议我坚持总结打卡,可以尝试写写博客. 那我就从这篇开始吧,希望开个好头! 上班的感觉真好 今天是入职的第二周 ...

  10. 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

    ​ 1 前言 在<ElasticSearch降本增效常见的方法>一文中曾提到过zstd压缩算法[1],一步一个脚印我们终于在京东ES上线支持了zstd:我觉得促使目标完成主要以下几点原因: ...