首页 > 其他分享 >6.CF431E Chemistry Experiment 权值线段树+二分

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

时间:2022-10-28 10:34:34浏览次数:90  
标签:rt val CF431E tree mid int Experiment ls 权值


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


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

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

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

题目分析

支试管,每支试管装有水银
*
次操作,操作有两种:

  • :倒掉试管的水银修改为
  • :将水任意分配至支试管里,最小化有的试管中最大体积,输出这个最小值,误差不超过算作正确。这个操作只是一次假想,不会真的把水倒进试管里。

线段树上二分,维护权值线段树记录权值个数、权值和

二分时,对于当前的,判断

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,
#define rson rs[rt], mid + 1,

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


标签:rt,val,CF431E,tree,mid,int,Experiment,ls,权值
From: https://blog.51cto.com/u_12372287/5803553

相关文章

  • CF 253D(矩阵-4角相等且矩阵权值有上限的矩阵数)
    D.4a矩阵timelimitpertestmemorylimitpertestinputoutput有一个 n ×......
  • [NOIP2014 提高组] 联合权值 dfs+技巧
    题意树上每个结点的权值为\(w_i\),若点\(i\)和点\(j\)满足:\(i\)和\(j\)的最短距离为2,则会产生$w_i*w_j$的联合权值。求最大联合权值和联合权值之和。分析①最大联合......
  • 权值线段树
    一.权值线段树权值线段树即一种线段树,以序列的数值为下标。节点里所统计的值为节点所对应的区间[l,r]中,[l,r]这个值域中所有数的出现次数。举个例子,有一个长度为10......
  • 264. 权值
    题目链接264.权值给定一棵\(N\)个节点的树,每条边带有一个权值。求一条简单路径,路径上各条边的权值和等于\(K\),且路径包含的边的数量最少。输入格式第一行两个整数......
  • 洛谷1351 -- 联合权值
      遍历一遍树,在遍历的同时,传入节点u的父亲和祖父,计算答案#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;......
  • mex(权值线段树+线段树上二分)
      思路:首先看到区间维护,想到线段树,但是很明显无法用线段树直接维护区间最小没出现过的自然数,因为假若一个节点的左右儿子节点的值都为0,我们是无法推断出父节点的值是几......
  • CF431E Chemistry Experiment
    CF431EChemistryExperiment题目大意有\(n\)支试管,每支试管装有\(h_i\ml\)的水银。\(q\)次操作,操作有两种:1\(p\)\(x\):倒掉试管\(p\)的水银修改为\(x\ml\)。2\(......
  • E 华华和月月种树 添加子节点并给子树加权值 树状数组+dfs序+离线操作
     链接:https://ac.nowcoder.com/acm/problem/23051来源:牛客网题目描述华华看书了解到,一起玩养成类的游戏有助于两人培养感情。所以他决定和月月......
  • 如何统计子树内控制深度的权值和 && ZLOJ 练习73 C 谈笑风生 & ZLOJ 练习17 B 王子 の
    writtenon2022-08-23两道题好像是一模一样的类型,特此总结缅怀我逝去的70分,,谈笑风生:王子:数据范围均在\(10^5\)级别王子那题给的更明显一点,就是控制深度,求一棵......
  • LCA C 求和 求子树权值和 树上节点单点修改 dfs序+树状数组
     链接:https://ac.nowcoder.com/acm/problem/204871来源:牛客网题目描述已知有 nnn个节点,有 n−1n-1n−1条边,形成一个树的结构。给......