NC53370 Forsaken的三维数点
题目
题目描述
 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的三维数点的更多相关文章
- 牛客小白月赛18——Forsaken的三维数点
		这个是一个简单题,不过因为想到比标程时间复杂度更低的方法就尝试了一下. 思路:虽然加点是三维数点,但是我们要求的是半径的大小,这样的话,就可以转变为一维的问题. 标程的解法是,用树状数组维护,然后二分 ... 
- 牛客小白月赛18 G	Forsaken的三维数点
		思路: 这是一道树状数组和二分的题,用线段树空间直接爆,时间也会超 然后这道题我犯了一个很低级的错误,导致我wa了十发左右,一个int型变量用lld输入,然后他给的提示是运行错误,我哭了,我一直以为是 ... 
- bzoj3295: [Cqoi2011]动态逆序对 三维数点
		为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ... 
- bzoj3262陌上花开 三维数点 cdq+树状数组
		大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ... 
- 三维数点的CDQ分治板子
		int n, k, tot; struct _ {int x,r,f;} a[N]; struct __ { int type; ll x,y; bool operator < (const _ ... 
- BZOJ1120 : [POI2009]STR
		因为问题的对称性,只需要考虑求出有多少点离$A$更近即可. 枚举$4$个绝对值的正负号,可以解出坐标范围. 若可以转化为二维数点,则可以统一扫描线+树状数组解决. 否则是三维数点,按一维排序,剩下两维 ... 
- HDU5618 & CDQ分治
		Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ... 
- AI robots CodeForces - 1045G (cdq分治)
		大意: n个机器人, 位置$x_i$, 可以看到$[x_i-r_i,x_i+r_i]$, 智商$q_i$, 求智商差不超过$k$且能互相看到的机器人对数. 这个题挺好的, 关键是要求互相看到这个条件, ... 
- JOISC2019 简要题解
		第18回 日本情報オリンピック 春合宿 オンラインコンテスト (JOISC2019) 官网 Day 1 試験 (Examination) description 有\(N\)个学生,每个学生有两科成绩 ... 
- 洛谷P4396 [AHOI2013]作业(树套树)
		题意 题目链接 Sol 为什么一堆分块呀..三维数点不应该是套路离线/可持久化+树套树么.. 亲测树状数组套权值线段树可过 复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线) # ... 
随机推荐
- PMP2023
			敏捷迭代周期过程中的会议 https://blog.csdn.net/xudahai513/article/details/125216704 https://img-blog.csdnimg.cn/ ... 
- 关于编写C时的调试--VS,VSCODE,DEV-C++
			1.问题 VS最大的问题是不支持scanf函数,后面的调试部分我就没试了,主要用VS来写C++ VSCODE是服了他的C/C++插件,我死活卡在debug中scanf的输入部分,集成终端根本无法输入, ... 
- Laravel - Eloquent  模型查询
			Laravel 的 Eloquent ORM 提供了漂亮.简洁的 ActiveRecord 实现来和数据库进行交互.每个数据库表都有一个对应的「模型」可用来跟数据表进行交互.你可以通过模型查找数据表内 ... 
- 【面试题精讲】说一说springboot加载配置文件优先级
			有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 文章更新计划 系列文章地址 Spring Boot 加载配置文 ... 
- [转帖]带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
			https://tidb.net/blog/29074d86#TiDB%20%E6%80%A7%E8%83%BD%E5%92%8C%E7%A8%B3%E5%AE%9A%E6%80%A7%E7%9A%8 ... 
- [转帖]s3fs把 s3-like 对象存储挂载到本地
			s3fs把 s3-like 对象存储挂载到本地 s3fs把 s3-like 对象存储挂载到本地 s3fs-fuse 是一个采用 c++ 开发的开源应用,它的作用是可以将 AWS S3 以及兼容 S3 ... 
- [转帖]jvm学习三-MAT内存分析工具的使用
			目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 ... 
- [转帖]CKA 真题
			https://segmentfault.com/a/1190000021380185 1.列出pod并排序 kubectl get pod --sort-by .metadata.name 题目 ... 
- DBLink实现备份文件不落盘的导入其他Oracle数据库实例的方法
			DBLink实现备份文件不落盘的导入其他Oracle数据库实例的方法 背景 公司内经常有从其他服务器备份数据库实例的需求 之前的操作一般需要,备份源服务器使用expdp将source导出dump文件. ... 
- 浅析大促备战过程中出现的fullGc,我们能做什么?
			作者:京东科技 白洋 前言: 背景: 为应对618.双11大促,消费金融侧会根据零售侧大促节奏进行整体系统备战.对核心流量入口承载的系统进行加固优化,排除系统风险,保证大促期间系统稳定. 由于大促期间 ... 
