H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

H - Hello Ms. Ze

给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类:

  • 把第xxx种材料修改为yyy个,
  • 只用[l,r][l, r][l,r]区间的材料制作衣服,每件衣服要用kkk个不同的材料,最多能做多少件,

先不考虑修改操作,对于区间[l,r][l, r][l,r]中的原料,我们可以做最多多少衣服,如何求解,

考虑二分答案,假设我们可以最多做xxx件衣服,显然对于个数大于等于xxx的材料,在每件衣服中我们只能使用一次,

假设我们当前二分的区间为[l,r][l, r][l,r],设材料数量大于midmidmid的有aaa种,材料数量小于等于midmidmid的数量和为sumsumsum

a+summid+1≥ka + \frac{sum}{mid + 1} \geq ka+mid+1sumk,说明答案在右区间,否则答案在左区间,其实这整个过程我们可以在线段树上直接二分执行。

考虑带修,树状数组套主席树,然后主席树上二分即可,由于答案值域在[1,105×106][1, 10 ^ 5 \times 10 ^ 6][1,105×106],所以我直接动态开点建了一颗值域在[1,1<<37][1, 1 << 37][1,1<<37]的主席树。

树套树

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;const long long maxn = 1ll << 37;int a[N], n, m;int root[N], ls[N << 9], rs[N << 9], tot[N << 9], num;long long sum[N << 9];void update(int &rt, long long l, long long r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += x * v, tot[rt] += v;if (l == r) {return ;}long long mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}inline int lowbit(int x) {return x & (-x);
}void update(int pos, int x, int v) {while (pos <= n) {update(root[pos], 1, maxn, x, v);pos += lowbit(pos);}
}int A[50], B[50], cnt1, cnt2;long long query(long long l, long long r, long long S, int cnt, int k) {if (l == r) {return l;}long long mid = l + r >> 1;long long ans = 0, res = 0;for (int i = 1; i <= cnt1; i++) {ans -= sum[ls[A[i]]];res -= tot[ls[A[i]]];}for (int i = 1; i <= cnt2; i++) {ans += sum[ls[B[i]]];res += tot[ls[B[i]]];}if ((S + ans) / (mid + 1) + cnt - res >= k) {S += ans, cnt -= res;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, S, cnt, 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, S, cnt, 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]);update(i, a[i], 1);}for (int i = 1, op, l, r, k; i <= m; i++) {scanf("%d %d %d", &op, &l, &r);if (op == 2) {update(l, a[l], -1);a[l] = r;update(l, a[l], 1);}else {scanf("%d", &k);cnt1 = cnt2 = 0;for (int j = l - 1; j; j -= lowbit(j)) {A[++cnt1] = root[j];}for (int j = r; j; j -= lowbit(j)) {B[++cnt2] = root[j];}printf("%lld\n", query(1, maxn, 0, r - l + 1, k));}}return 0;
}

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

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

相关文章

JVM——逃逸分析

首先&#xff0c;为解释这个问题&#xff0c;需要的基本知识如下&#xff08;如果对以下概念不太熟悉&#xff0c; 可以先Google下&#xff09;&#xff1a; 1.JVM内存结构&#xff0c;传送门 2.即时编译&#xff08;JIT&#xff09;&#xff0c;传送门 逃逸分析 在编译期间…

ASP.NET Core SignalR:集线器Hub

一、什么是集线器hubs通过SignalR的集线器hubs中定义的方法&#xff0c;服务器可以调用连接中的客户端定义的方法&#xff0c;而客户端也可以调用服务器端集线器中定义的方法。SignalR负责实现了客户端和服务器之间的实时通信。二、配置SignalR的hubsSignalR通过在Startup.Conf…

P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)

P6271 [湖北省队互测2014]一个人的数论 ∑i1nim[gcd⁡(i,n)1]∑d∣nμ(d)dm∑i1ndim由伯努利数可知∑i0nim1m1∑i0mCm1iBi(n1)m−i1设fi1m1Bm−i1Cm1i,则有∑d∣nμ(d)dm(∑i1m1fi(nd)i(nd)m)∑i1m1fini∑d∣nμ(d)dm−i(nm∑d∣nμ(d))考虑后项∑d∣nμ(d)dm−i&#xff0c;迪…

Java面试题汇总

1、综合素质层面 个人介绍、离职原因、兴趣爱好等 https://mp.weixin.qq.com/s?__bizMzI3NzE0NjcwMg&mid2650121143&idx2&snf4c4f26bc5d2132352f12d28c8cb2264&chksmf36bbe96c41c3780d8086adec7be8737ce3718db9c2a7fa33aa7591f8ae179ed3240286f3886&scen…

微软发布.Net Core 3.0 RC1,最终版本定于9月23日

2019.9.17 微软 宣布推出.NET Core 3.0 Release Candidate 1。就像Preview 9一样&#xff0c;主要专注于为 .NET Core 3.0 发布最终版本 。现在变得非常非常接近。将在9月23日.NET Conf上发布最终版本。.NET Core 3.0是从仅支持Windows传统的 .NET框架向更现代化的开源实现过渡…

JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的&#xff0c;跨平台语言&#xff0c;其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似&#xff0c;很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和Java对象模型&#xff0c;这就是三个截然不同的概念&…

ZOJ The Sum of Unitary Totient(min_25 筛)

The Sum of Unitary Totient 积性函数&#xff0c;满足质数点是多项式&#xff0c;直接 min_25 了&#xff0c;由于单次求解&#xff0c;所以使用递归的 min_25 会较快。 #include <bits/stdc.h>using namespace std;const int N 1e5 10;int prime[N], a[N], id1[N],…

迫于误解压力,RMS从自由软件基金会与MIT离职

自由软件基金会官网显示&#xff0c;基金会创始人兼主席、自由软件运动发起人 Richard M. Stallman&#xff08;RMS&#xff09;辞去主席职务并辞去董事会职务。而另一边&#xff0c;stallman.org 邮件列表显示&#xff0c;RMS 已经从麻省理工学院&#xff08;MIT&#xff09;计…

F - Colorful Tree(LCA,树上差分,离线处理)

F - Colorful Tree 给定一棵树&#xff0c;边有边权&#xff0c;且每条边有一个颜色&#xff0c;有mmm次操作&#xff0c; 每次给定x,y,u,vx, y, u, vx,y,u,v&#xff0c;如果把颜色为xxx的边&#xff0c;边权修改为yyy&#xff0c;求u,vu, vu,v两点的距离&#xff0c;考虑 …

让人迷茫的三十岁!从专业技能、行业知识和软实力谈一下!

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区合伙人&#xff01;我今年三十岁&#xff0c;我很迷茫&#xff0c;不知道未来该选择什么发展方向。这是我无意中在社区微信群中看到的一位年轻的开发者说的话&#xff0c;之前他也经常会在技术群…

D. Steps to One(概率DP,莫比乌斯反演)

D. Steps to One 设f[i]f[i]f[i]为gcd⁡\gcdgcd为iii&#xff0c;还需要多少个数&#xff0c;那么有f[i]1∑j1mf[gcd⁡(i,j)]mf[i] 1 \frac{\sum\limits_{j 1} ^{m} f[\gcd(i, j)]}{m}f[i]1mj1∑m​f[gcd(i,j)]​&#xff0c; f[1]0f[1] 0f[1]0&#xff0c;考虑化简∑j1mf…

误用.Net Redis客户端工具CSRedisCore,自己挖坑自己填

前导  上次Redis MQ分布式改造完成之后&#xff0c; 编排的容器稳定运行了一个多月&#xff0c;昨天突然收到ETL端同事通知&#xff0c;没有采集到解析日志了。赶紧进服务器看了一下&#xff0c;用于数据接收的receiver容器挂掉了&#xff0c; 尝试docker container start [c…

Java——类加载机制

** 一、什么是类的加载 ** 类的加载指的是将类的.class文件中的二进制数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内&#xff0c;然后在堆区创建一个java.lang.Class对象&#xff0c;用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class…

.NET中国峰会议题征集

月初做的调查《》&#xff0c;参与人数576人&#xff0c;愿意参与分享.NET Core经验的142人&#xff0c;今天发起分会场主题演讲和闪电演讲议题.2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.N…

E. Almost Sorted(构造,递归)

E. Almost Sorted 我们定义 almost sorted 数组为&#xff0c;ai1≥ai−1a_{i 1} \geq a_i - 1ai1​≥ai​−1&#xff0c;也就是说&#xff0c; 先写几项出来看看&#xff1a; n 1 1 n 2 1 2 2 1 n 3 1 2 3 1 3 2 2 1 3 3 2 1 容易发现一定是&#xff0c;形如x,x−1,x−…

D. Cut and Stick(Codeforces Round #716 (Div. 2))

D. Cut and Stick 给定一个长度为nnn的数组&#xff0c;里面元素为a1,a2,a3,…,an−1,an,(1≤ai≤n)a_1, a_2, a_3, \dots, a_{n- 1}, a_n, (1 \leq a_i \leq n)a1​,a2​,a3​,…,an−1​,an​,(1≤ai​≤n)&#xff0c;有mmm次询问&#xff0c;每次给定l,rl, rl,r&#xff0…

一些学习教程资料等你来拿

近期整理自己的云盘中发现近年来私藏了很多学习资料和教程&#xff0c;本着独乐乐不如众乐乐的精神&#xff0c;特将其分享出来供有兴趣的童鞋学习。进入公众号&#xff0c;输入关键词"敏捷"/"agile"/"scrum"&#xff0c;即可获得敏捷开发类别的…

Java——编译与反编译

** 一、基础知识 ** 1.1 编程语言 在介绍编译和反编译之前&#xff0c;我们先来简单介绍下编程语言&#xff08;Programming Language&#xff09;。编程语言&#xff08;Programming Language&#xff09;分为低级语言&#xff08;Low-level Language&#xff09;和高级语…

程序员自家种水果,新鲜包邮配送

上次猕猴桃的活动<好多小伙伴&#xff0c;买了一箱尝过后又下单了好几箱。事实证明&#xff0c;品质才是销量的最佳保证。有些粉丝找到我说&#xff0c;自己家也有果园自己种水果&#xff0c;都是当天采摘当天发货的纯天然水果。于是他们给我寄了一些自家种的苹果、香瓜、冬…

2016-2017 ACM-ICPC CHINA-Final(7 / 12)

2016-2017 ACM-ICPC CHINA-Final A. Number Theory Problem&#xff08;规律、签到&#xff09; #include <bits/stdc.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdo…