E 速度即转发(牛客挑战赛48)(树套树)

速度即转发

给定一个长度为nnn的数组aaa,里面元素为a1,a2,a3,…,an−1,ana_1, a_2, a_3, \dots, a_{n - 1}, a_na1,a2,a3,,an1,an

有两种操作:

  • 修改ap=ka_p = kap=k
  • 给定l,r,kl, r, kl,r,k,设S(x)=∑i=lrmax(ai−x,0)S(x) = \sum\limits_{i = l} ^{r} max(a_i - x, 0)S(x)=i=lrmax(aix,0),求x∈[0,105]x \in[0, 10 ^ 5]x[0,105]内满足S(x)≥kS(x) \geq kS(x)k的最大整数xxx

保证任何时刻数组值域在[0,105][0, 10 ^ 5][0,105],对于查询操作0≤k≤1050 \leq k \leq 10 ^ 50k105

有个简单的想法树状数组套主席树,对于操作一,直接修改即可O(log⁡2n)O(\log ^ 2 n)O(log2n),对于操作二,二分答案O(log⁡3n)O(\log ^ 3 n)O(log3n)

显然三个log⁡\loglog的算法,复杂度有点大可能过不了,考虑在线段树上二分答案,

假设我们当前所在的区间是[l,r][l, r][l,r],显然左子树代表的值域范围是[l,mid][l, mid][l,mid],右子树所代表的是[mid+1,r][mid + 1, r][mid+1,r]

如果答案在右子树,则答案最少为mid+1mid + 1mid+1,这个时候只要判断是否有ls_sum−sz_ls×(mid+1)≥kls\_sum - sz\_ls \times (mid + 1) \geq kls_sumsz_ls×(mid+1)k即可,

如果成立,则说明答案最少为mid+1mid + 1mid+1我们可以进入右子树搜索,否则我们进入右子树搜索,最后我们到达的叶节点即为最优的答案

我们在递归的时候,两个变量upper_sum,upper_szupper\_sum, upper\_szupper_sum,upper_sz,当我们进入左子树的时候,把右子树的sum,szsum, szsum,sz同时累加到这两个变量上去,

由于我们往左子树走了,说明答案小于mid+1mid + 1mid+1了,右子树记录的信息都是≥mid+1\geq mid + 1mid+1
在下一步的judgejudgejudge中我们可以直接使用右子树的信息。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10, maxn = 100000;typedef long long ll;int a[N], n, m;int root[N], ls[N << 7], rs[N << 7], num;ll sum[N << 7], sz[N << 7];inline int lowbit(int x) {return x & (-x);
}void update(int &rt, int l, int r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += x * v, sz[rt] += v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}void modify(int rt, int x, int v) {while (rt <= n) {update(root[rt], 0, maxn, x, v);rt += lowbit(rt);}
}int A[110], B[110], cnt1, cnt2;int query(int l, int r, ll upper_sum, ll upper_sz, ll k) {if (l == r) {if (upper_sum - upper_sz * l >= k) {return l;}return -1;}int mid = l + r >> 1;ll cur_sum = 0, cur_sz = 0;for (int i = 1; i <= cnt1; i++) {cur_sum -= sum[rs[A[i]]], cur_sz -= sz[rs[A[i]]];}for (int i = 1; i <= cnt2; i++) {cur_sum += sum[rs[B[i]]], cur_sz += sz[rs[B[i]]];}if (cur_sum + upper_sum - 1ll * (mid + 1) * (upper_sz + cur_sz) >= k) {for (int i = 1; i <= cnt1; i++) {A[i] = rs[A[i]];}for (int i = 1; i <= cnt2; i++) {B[i] = rs[B[i]];}return query(mid + 1, r, upper_sum, upper_sz, k);}else {for (int i = 1; i <= cnt1; i++) {A[i] = ls[A[i]];}for (int i = 1; i <= cnt2; i++) {B[i] = ls[B[i]];}return query(l, mid, upper_sum + cur_sum, upper_sz + cur_sz, k);}
}int get_ans(int l, int r, ll k) {cnt1 = cnt2 = 0;for (int i = l - 1; i; i -= lowbit(i)) {A[++cnt1] = root[i];}for (int i = r; i; i -= lowbit(i)) {B[++cnt2] = root[i];}return query(0, maxn, 0, 0, k);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);modify(i, a[i], 1);}ll k;for (int i = 1, op, l, r, p; i <= m; i++) {scanf("%d", &op);if (op) {scanf("%d %lld", &p, &k);modify(p, a[p], -1);a[p] = k;modify(p, a[p], 1);}else {scanf("%d %d %lld", &l, &r, &k);printf("%d\n", get_ans(l, r, k));}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

volatile实现原理

先Mark&#xff0c;后续完成 https://segmentfault.com/a/1190000017255405 http://ifeve.com/volatile/ http://cmsblogs.com/?hmsrtoutiao.io&p2092&utm_mediumtoutiao.io&utm_sourcetoutiao.io https://my.oschina.net/u/2288283/blog/656572 https://blog.…

分析一次double强转float的翻车原因

人逢喜事精神爽,总算熬到下班撩~~正准备和同事打个招呼回家,被同事拖住问了.?‍♂️: 你们组做的那块代码,把double类型数据成float有问题啊?.?‍♀️: 嗯?不对是正常啊,float精度是没有double高,但float能保存到小数点后好多位,对我们来说完全够用了!?‍♂️: 不是啊,这不…

L 苍天阻我寻你,此情坚贞如一(西南科技大学2021届新生赛)(线段树)

苍天阻我寻你&#xff0c;此情坚贞如一 给定两个长度为nnn的数组a,ba, ba,b&#xff0c;满足−103≤ai,bi≤103-10 ^ 3 \leq a_i, b_i \leq 10 ^ 3−103≤ai​,bi​≤103&#xff0c;每个数字xxx表示向前走xxx步&#xff0c;如果是负数则后退嘛&#xff0c;设小AAA执行aaa数组…

Java并发常用方法 sleep 和 wait

一&#xff1a;sleep 和 wait sleep()方法&#xff1a; 功能&#xff1a;让当前线程休眠指定时间&#xff0c;休眠时间的准确性依赖于系统时钟和CPU调度机制是Thread类的静态方法可在任何地方调用&#xff0c;需要处理InterruptedException当前线程调用sleep()方法&#xff0…

.NET Core 3.0之深入源码理解Host(二)

写在前面停了近一个月的技术博客&#xff0c;随着正式脱离996的魔窟&#xff0c;接下来也正式恢复了。本文从源码角度进一步讨论.NET Core 3.0 中关于Host扩展的一些技术点&#xff0c;主要内容是关于创建Long Run Program的创建与守护。关于Host&#xff0c;我们最容易想到的就…

Finding Hotels(牛客国庆集训派对Day7 )(2016ICPC青岛K)(K-D Tree)

Finding Hotels 给定二维平面上nnn个点&#xff0c;每个点描述为x,y,cx, y, cx,y,c&#xff0c;x,yx, yx,y为坐标&#xff0c;ccc为该点的价值&#xff0c; 有mmm个询问&#xff0c;每次询问给x,y,cx, y, cx,y,c&#xff0c;要求&#xff0c;点的价值小于等于ccc的条件下&…

Java多线程常用方法 wait 和 notify

一&#xff1a;从一道面试题说起 启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100 要求用 Java 的 wait notify 机制来实现 解法&#xff1a; public class Test {private static Object lock new Object();private st…

dotNET Core实现分布式环境下的流水号唯一

业务背景在管理系统中&#xff0c;很多功能模块都会涉及到各种类型的编号&#xff0c;例如&#xff1a;流程编号、订单号、合同编号等等。编号各有各自的规则&#xff0c;但通常有一个流水号来确定编号的唯一性&#xff0c;保证流水号的唯一&#xff0c;在不同的环境中实现方式…

单位根反演小记

单位根反演 一个等式&#xff1a;[n∣a]1n∑k0n−1wnak[n \mid a] \frac{1}{n} \sum\limits_{k 0} ^{n - 1}w_n ^{ak}[n∣a]n1​k0∑n−1​wnak​ 证明&#xff1a; wnaw_n ^ awna​是nnn次单位根的aaa次方&#xff0c;所以这里是一个公比为wnaw_n ^ awna​的等比数列&…

.NET Core3发布Json API

我们给DNC3&#xff08;.NET Core 3&#xff09;上了一个新包&#xff0c;叫做System.Text.Json(点我下载)&#xff0c;支持读写器&#xff0c;DOM&#xff08;文档对象模型&#xff09;&#xff0c;和序列化&#xff0c;在这篇博文里&#xff0c;我会告诉大家为什么要做这个&a…

Java ThreadLocal

** 一&#xff1a;ThreadLocal的简要介绍及使用 ** Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此&#xff0c;如果一段代码含有一个ThreadLocal变量的引用&#xff0c;即使两个线程同时执行这段代码&#xff0c;它们也无法访问到对方的ThreadLocal变…

P5591 小猪佩奇学数学(单位根反演)

P5591 小猪佩奇学数学 ∑i0n(in)pi⌊ik⌋⌊ik⌋i−i%kk1k∑i0n(in)pi(i−i%k)1k∑i0n(in)pii−1k∑i0n(in)pi(imodk)\sum_{i 0} ^{n} (_i ^ n) \times p ^ i \times \lfloor \frac{i}{k} \rfloor\\ \lfloor \frac{i}{k} \rfloor \frac{i - i \% k}{k}\\ \frac{1}{k} \sum_{i …

认证方案之初步认识JWT

前言&#xff1a;现在越来越多的项目或多或少会用到JWT&#xff0c;为什么会出现使用JWT这样的场景的呢&#xff1f;假设现在有一个APP&#xff0c;后台是分布式系统。APP的首页模块部署在上海机房的服务器上&#xff0c;子页面模块部署在深圳机房的服务器上。此时你从首页登录…

Java实现生产消费模型的5种方式

** 前言 ** 生产者和消费者问题是线程模型中的经典问题&#xff1a;生产者和消费者在同一时间段内共用同一个存储空间&#xff0c;生产者往存储空间中添加产品&#xff0c;消费者从存储空间中取走产品&#xff0c;当存储空间为空时&#xff0c;消费者阻塞&#xff0c;当存储…

C#.NET 一颗璀璨的全能明星

C# 是微软推出的一种基于.NET框架的、面向对象的高级编程语言&#xff0c;她可以做什么呢&#xff1f;1.桌面开发&#xff0c;WinForm/GUI可视化编程&#xff1a;Windows开发中的葵花宝典&#xff0c;霸主地位至今无出其右&#xff0c;开发效率令人发指&#xff0c;大部分营销软…

#3328. PYXFIB(单位根反演)

#3328. PYXFIB ∑i0⌊nk⌋CnikFik∑i0nCniFi[i≡0(modk)]i≡0(modk)&#xff0c;单位根反演有1k∑j0k−1wkij1k∑i0nCniFi∑j0k−1wkij\sum_{i 0} ^{\lfloor \frac{n}{k} \rfloor} C_{n} ^{i \times k} \times F_{i \times k}\\ \sum_{i 0} ^{n} C_n ^{i} \times F_i \times …

Leetcode 86. 分隔链表

给定一个链表和一个特定值 x&#xff0c;对链表进行分隔&#xff0c;使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head 1->4->3->2->5->2, x 3输出: 1->2->2->4->3->5题目分析…

深入理解 JVM Class文件格式(一)

** 一、JVM体系结构 ** ** 二、class格式文件概述 ** class文件是一种8位字节的二进制流文件&#xff0c; 各个数据项按顺序紧密的从前向后排列&#xff0c; 相邻的项之间没有间隙&#xff0c; 这样可以使得class文件非常紧凑&#xff0c; 体积轻巧&#xff0c; 可以被J…

min_25 推导及例题总结

min_25 筛 一个亚线性筛&#xff0c;复杂度大概是O(n34log⁡n)O(\frac{n ^{\frac{3}{4}}}{ \log n})O(lognn43​​)。 使用min_25min\_25min_25求前缀和&#xff0c;有两个基本特征&#xff1a;① 积性函数&#xff0c;② 满足质数点为多项式。 算法思路 给定n≤1011n \leq…

asp.net core 使用 signalR(一)

asp.net core 使用 signalR&#xff08;一&#xff09;IntroSignalR 是什么&#xff1f;ASP.NET Core SignalR 是一个开源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。实时 Web 功能使服务器端代码能够即时将内容推送到客户端。SignalR 的适用对象&#xff1a;需…