首页 > 其他分享 >NC53370 Forsaken的三维数点

NC53370 Forsaken的三维数点

时间:2023-05-03 15:34:04浏览次数:53  
标签:rt return int NC53370 数点 Forsaken leq op

题目链接

题目

题目描述

​ 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;
}

标签:rt,return,int,NC53370,数点,Forsaken,leq,op
From: https://www.cnblogs.com/BlankYang/p/17369122.html

相关文章

  • 区间不同数的个数 二维数点 扫描线 可持久化线段树
    二维数点,对于询问的\([l,r]\)区间我们只需要统计有多少个数上一次出现的位置\(pos\)满足\(pos\leql\),即可。template<classT>structBIT{Tc[N];intsize;voidresize(ints){size=s;}Tquery(intx){//1...xassert(x<=size);......
  • C# 小数转百分比以及小数转字符串精确小数点
    模拟游戏中相乘减伤计算staticvoidTest(){Calc(newdouble[]{0.1,0.3,0.2,0.17,0.5});}staticvoidCalc(double[]arr){doubletotal=1;foreach(vardinarr){total*=(1-d......
  • JS-数学表达式正则表达式支持(包含希腊字母、小数点等)
    //技术状况规则/**evt:{target:{value:''}},row:{"propName":"""propRule":""}*/functioncheckRule(evt,row,propName,propRule){//匹配a=5,a>5,a<5,a≤6,a≥5等varrule1=/[ΆΈ-ώa-zA-z]+([1-9]......
  • Q:oracle小于1的number,不显示小数点前的0?
    oracle存储number类型数字 如果数字小于1如0.35就会存储.35 省略掉前面的数字0方法1:oracle 数据库字段值为小于1的小数时,转换到char类型处理,会丢失小数点前面的0      例如0.35就变成了.35 2.解决办法:用to_char函数格式化数字显示      select    ......
  • 如何去掉echarts饼图小数点
    series : {                         name : '票数占比' ,                         type : 'pie' ,                         radius  :   '72%' , //设置饼图大小     ......
  • 用库函数点亮一个灯1
    【1】为工程添加库函数  【2】打开固件库文件夹找源文件  【3】全选粘贴  【4】打开库函数inc文件夹,一样复制粘贴头文件  【5】回到keil添加  【6】还有三个  【7】添加一些东西和设置使头文件可用  【8】重新编译。当时报错两个,弹幕说重启即......
  • SPSS小技巧:调整输出结果中的小数点位数
    https://zhuanlan.zhihu.com/p/473444950?utm_id=0SPSS小技巧:调整输出结果中的小数点位数数据小兵​死磕数据统计分析方法,可答疑咨询 5人赞同......
  • mysql sum 聚合计算后精度不准 出现多位小数点后的数
    解决办法原收款单money字段为decimal(28,8)经过层层计算用到了@total:=(beginning+@total+gather-verification)AS'balance',@num:=......
  • Schoof 算法: 有限域上椭圆曲线数点 (半成品)
    在某个域\(K\)上,由关于\(X,Y\)的多项式方程\[E:Y^2=X^3+AX+B\]定义出的曲线我们称为椭圆曲线(ellipticcurve).准确的说,我们这个时候一般考虑域的特......
  • 保留小数点相关问题
    一,保留两位小数常用的几种方法1,使用java.util.Formatter类publicstaticStringformat2(doublevalue){/**%.2f%表示小数点前任意位数2表......