当前位置: 首页 > news >正文

6.CF431E Chemistry Experiment 权值线段树+二分

6.CF431E Chemistry Experiment 权值线段树+二分

个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客

给定数列,区间查询和,区间取模,单点修改。
记录区间最大值,对于区间最大值小于模数的区间不予更新

洛谷传送门:CF431E Chemistry Experiment - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

CF传送门:E. Chemistry Experiment (codeforces.com)

题目分析

n n n支试管,每支试管装有 h i   m l h_i\ ml hi ml水银
*
q q q次操作,操作有两种:

  • 1 1 1 p p p x x x:倒掉试管 p p p的水银修改为 x   m l x\ ml x ml
  • 2 2 2 v v v:将 v   m l v\ ml v ml水任意分配至 n n n支试管里,最小化有的试管中最大体积,输出这个最小值,误差不超过 1 0 − 4 10^{-4} 104算作正确。这个操作只是一次假想,不会真的把水倒进试管里。

线段树上二分,维护权值线段树记录权值个数 s i z siz siz、权值和 c n t cnt cnt

二分时,对于当前的 m i d mid mid,判断 m i d ∗ s i z [ l , m i d ] − c n t [ l , m i d ] mid * siz[l, mid] - cnt[l, mid] midsiz[l,mid]cnt[l,mid] 与当前剩余水的大小关系,以此决定二分方向。

Code

#include <bits/stdc++.h>
#define int long long
#define double long double
#define endl '\n'
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
using namespace std;

const int N = 3e6 + 10, LEN = 1e7 + 10;
int h[N];
int n = 0, q = 0, root = 0;

namespace SegTree{
    #define lson ls[rt], l, mid
    #define rson rs[rt], mid + 1, r

    int tree[N][2], ls[N], rs[N], tot = 0;

    inline void push_up(int rt){ 
        tree[rt][0] = tree[ls[rt]][0] + tree[rs[rt]][0];
        tree[rt][1] = tree[ls[rt]][1] + tree[rs[rt]][1];
    }

    void update(int &rt, int l, int r, int pos, int val){
        if(!rt) rt = ++tot; 
        if(l == r){
            tree[rt][0] += val;
            tree[rt][1] += pos * val;
            return;
        }
        int mid = l + r >> 1;
        if(mid >= pos) update(lson, pos, val);
        else update(rson, pos, val);
        push_up(rt);
    }

    double search(int rt, int l, int r, int v){
        int siz = 0, cnt = 0;
        while(l != r){
            double mid = (l + r) / 2, val = mid * (siz + tree[ls[rt]][0]) - cnt - tree[ls[rt]][1];
            if(v < val) r = mid, rt = ls[rt];
            else{
                l = mid + 1, cnt += tree[ls[rt]][1], siz += tree[ls[rt]][0], rt = rs[rt];
            }
        }
        double ans = l + (v - (l * (siz + tree[ls[rt]][0]) - cnt - tree[ls[rt]][1])) * 1.0 / siz;
        return ans;
    }
}


#define SEGRG root, 0, 1e10

inline void solve(){
    cin >> n >> q;
    for(int i = 1; i <= n; i++) cin >> h[i], SegTree::update(SEGRG, h[i], 1);
    while(q--){
        int op, v; cin >> op >> v;
        if(op == 1){
            int x; cin >> x;
            SegTree::update(SEGRG, h[v], -1);
            h[v] = x;
            SegTree::update(SEGRG, h[v], 1);
        } else {
            cout << SegTree::search(SEGRG, v) << endl;
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout << fixed << setprecision(12);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

相关文章:

  • 基于RFID技术的智能书架系统
  • 1014 Circles of Friends
  • Linux 下进程间通讯之内存映射详解
  • ROS官方教程知识点总结[低阶阶段]
  • Linux常见命令汇总-基于CentOS7
  • 让软件集成为您的业务创造更多价值
  • 猿创征文 | 云服务器部署——将项目部署到云服务器上
  • PET-MRI医学图像融合与混合神经胶质瘤分类模型
  • RACV2022观点集锦 | 视觉基础模型
  • 【GNN报告】复旦大学许嘉蓉:基于图数据的鲁棒机器学习
  • 树链剖分模板
  • 华为防火墙基础自学系列 | Hub Spoke IPsec VdPdNd
  • 瑞士知名媒体深度报道孙宇晨外交成绩:数字经济全球布道者
  • 网课查题公众号 对接查题题库
  • 03Redis-五大基本数据类型
  • [NodeJS] 关于Buffer
  • HTTP那些事
  • JavaScript类型识别
  • 记一次删除Git记录中的大文件的过程
  • 坑!为什么View.startAnimation不起作用?
  • PostgreSQL之连接数修改
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 移动端高清、多屏适配方案
  • 整理一些计算机基础知识!
  • ![CDATA[ ]] 是什么东东
  • # 飞书APP集成平台-数字化落地
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)Java 简介
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (排序详解之 堆排序)
  • (转)c++ std::pair 与 std::make
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET CORE Aws S3 使用
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [Android]常见的数据传递方式
  • [GN] Vue3快速上手1
  • [LeetCode] 178. 分数排名
  • [Linux] LVS+Keepalived高可用集群部署
  • [Mybatis-Plus笔记] MybatisPlus-03-QueryWrapper条件构造器
  • [node] Node.js的Web 模块
  • [one_demo_12]递归打印*\n*.*.\n*..*..\n图形
  • [root]既然sudo 可以暂时获取root权限,那么为何还需要root这个用户呢