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

线段树上二分模板

板子链接:Ex - Rating Estimator

洛谷链接:AT_abc292_h [ABC292Ex] Rating Estimator - 洛谷

误区:

对原式进行数学变形(这里a[i]就是p[i])

                                                        \sum_{j=1}^{i} a[i] \geq B*i

                                                      \sum_{j=1}^{i}(a[i]-B)\geq 0

                ​​​​​​​        ​​​​​​​                   ​​​​​​​        ​​​​​​​        b[i]=a[i]-B

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​    \sum_{j=1}^{i}b[i] \geq 0

在数学上是成立的,但b[i]不满足单调性,故无法直接二分。

分析

我们可以用线段树维护b数组的前缀最大值,然后找到第一个≥0的i即可。

实现:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 500005;
int n, b, q, a[N], s[N];
struct sgt{struct node{int lzy, res; //tag和最大值}tr[N << 2];void pushup(int u){tr[u].res = max(tr[u << 1].res, tr[u << 1 | 1].res);}void build(int u, int l, int r){if(l == r){tr[u].res = s[l];return;}int mid = l + r >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);pushup(u);}void maketag(int u, int v){tr[u].res += v;tr[u].lzy += v;}void pushdown(int u){if(!tr[u].lzy) return;maketag(u << 1, tr[u].lzy);maketag(u << 1 | 1, tr[u].lzy);tr[u].lzy = 0;}void modify(int u, int l, int r, int L, int R, int v){if(l >= L && r <= R){maketag(u, v);return;}int mid = l + r >> 1;pushdown(u);if(L <= mid) modify(u << 1, l, mid, L, R, v);if(R > mid) modify(u << 1 | 1, mid + 1, r, L, R, v);pushup(u);}pair<int, int> qry(int u, int l, int r){if(tr[u].res < 0) return {-1, -1};if(l == r) return {l, tr[u].res};int mid = l + r >> 1;pushdown(u);auto res = qry(u << 1, l, mid);if(res.first != -1) return res;return qry(u << 1 | 1, mid + 1, r);}
}T;
signed main(){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> b >> q;int cur = 0;for(int i = 1; i <= n; i++){cin >> a[i];cur += a[i];s[i] = s[i - 1] + a[i] - b;}T.build(1, 1, n);while(q--){int c, x;cin >> c >> x;cur += x - a[c];T.modify(1, 1, n, c, n, x - a[c]);a[c] = x;auto pos = T.qry(1, 1, n);cout << fixed << setprecision(15);if(pos.first == -1) cout << 1.0 * cur / n << '\n';else cout << (1.0 * pos.second / pos.first) + b << '\n';}return 0;
}

防烫:只要你的输出与真值的绝对误差或相对误差不超过10^{-9},就会被判定为正确。

http://www.dtcms.com/a/462550.html

相关文章:

  • Origin绘制3D坐标下边际直方图
  • 二叉树OJ(三)543. 二叉树的直径 124. 二叉树中的最大路径和 困难
  • 濮阳做公司网站重庆物流最新消息
  • IDEA Maven 仓库配置优先级
  • 手机网站建设网站wordpress 后台登陆 修改
  • 做网站分什么软件wordpress epanel
  • 微信生活门户网站源码局网站建设申请
  • 做的网站没流量吗什么叫门户类网站
  • 互动网站如何做h5邀请函制作软件app
  • ImageNet数据集
  • 做传销网站后果严重吗个人公司如何注册
  • 火箭升空检测识别数据集:近3w图像,3类,yolo标注
  • 【密码学】对称加密与非对称加密在JS逆向与爆破测试中的应用
  • Qt 自定义无标题栏窗口:FramelessWidget 实现与解析
  • 海林建设局网站济南百度推广排名优化
  • 扩充ec2硬盘对应的lvm
  • 哪些公司的网站做的漂亮上海优化排名推广
  • 做素材类的网站赚钱吗改进网站建设
  • 中山好的网站建设西安公关公司
  • 网页网站的制作过程dedecms建设慕课网站
  • K8S(二)—— K8S 1.28 集群部署指南(kubeadm 方式)
  • Eclipse Mosquitto 在小内存下怎么修改配置文件
  • 猫眼浏览器(Chrome内核增强版浏览器)官方便携版
  • 福建省住房和建设厅网站合同 制作 网站
  • 构建可信数据体系——解读数据治理指南-构建可信数据路线图【附全文阅读】
  • qemu调试edk2
  • 正规网站做菠菜广告焦作网站建设哪家正规
  • 有什么网站可以发布个人信息网站优化计划书
  • 小程序停车场名称动态化实现方案
  • 张家港建设工程质量监督站网站中国廉政文化建设网站