题目链接

题目

题目描述

​ 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. Postman 接口测试配置 Pre-request Script

    本文为博主原创,转载请注明出处:  Pre-request Script 为Postman预置脚本,用于在postman 发送请求之前执行,封装计算或获取某些请求参数. 1. postman 脚本提供 ...

  2. 【译】Visual Studio 2013 退役 :旧版本 Visual Studio 的支持提醒

    新年到了,也是提醒我们 Visual Studio 支持生命周期中即将到来的日期的好时机.对 Visual Studio 2013 的支持将于今年4月9日结束.如果您使用的是旧版本的Visual St ...

  3. CSS - 怎么样在不同分辨率的情况下计算根元素需要的font-size的值

    一般我们做页面,肯定都会有设计图,移动端页面,一般情况下,UI出图都会定宽为640px,这也是移动端的标准尺寸:但是,我们也不能排除可能有其他特殊的情况可能需要做其他大小的设计图.所以,我们可以先定一 ...

  4. 【Spring 5核心原理】1设计模式

    1.1开闭原则 开闭原则(open-closed principle,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭.所谓的开闭,也正是对扩展和修改两个行为的一个原则. 强调用 ...

  5. [转帖]XCopy命令实现增量备份

    https://www.cnblogs.com/pachongshangdexuebi/p/5051977.html xcopy XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝, ...

  6. [转帖]LVS入门篇(五)之LVS+Keepalived实战

    LVS入门篇(五)之LVS+Keepalived实战 https://www.cnblogs.com/linuxk/p/9365189.html 一.实验架构和环境说明 (1)本次基于VMware W ...

  7. [转帖]【Kafka】(二)Kafka去Zookeeper化,kraft模式搭建

    1.简介 由于zookeeper慢慢的成了kafka的瓶颈,kafka提出了去zookeeper化的概念,并在2.8版本之后版本都包含了kraft模式,也就是不需要使用zookeeper了,目前这种模 ...

  8. [转帖]Intel“革命性”X86s架构,带来哪些颠覆及影响?

    https://www.eet-china.com/mp/a221822.html 英特尔发布了一份新的白皮书(Intel X86-S扩展架构规格),计划简化其处理器指令集架构(ISA).英特尔提供了 ...

  9. [转帖]Arm vs X86 (unfinished)

    http://home.ustc.edu.cn/~shaojiemike/posts/arm/   ARM Ltd history 诞生 1981年,被Intel拒绝的Acorn(橡子) Comput ...

  10. [转帖]拜托!面试请不要再问我Spring Cloud底层原理

    https://www.cnblogs.com/jajian/p/9973555.html 概述# 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大 ...