B.The Tortoise and the Hare 长春

B. The Tortoise and the Hare

给定一个长度为nnn的数组a,(1≤ai<m)a, (1 \leq a_i < m)a,(1ai<m)mmm是一个给定的数(1≤m≤109)(1 \leq m \leq 10 ^ 9)(1m109),有QQQ次操作,分为两类:

  • 给定u,v,(1≤u≤n,1≤v<m)u, v,(1 \leq u \leq n, 1 \leq v < m)u,v,(1un,1v<m),把数组上aua_uau的值改为vvv
  • 给定l,r,k,(1≤l≤r≤n,1≤k≤r−l)l, r, k, (1 \leq l \leq r \leq n, 1 \leq k \leq r - l)l,r,k,(1lrn,1krl),每次对[l,r][l, r][l,r]区间内前r−l+1−kr - l + 1 - krl+1k小的数都+1+ 1+1,问最多能进行多少次操作, 使得i∈[l,r],ai<mi \in[l, r], a_i < mi[l,r],ai<m恒成立。

对于操作一,我们直接修改即可,如何计算询问二呢,我们思考如下一个问题:

给定一个长度为nnn的数组aaa,每次我们要选择kkk个不同的数,把这kkk个数的值都减111,问我们最多能进行几次操作。

这个问题考虑最优解法,其实就是每次拿前kkk大,然后对这kkk个数都减111,知道不能进行操作为止。

不难发现其实这个问题,跟我们的询问二操作是几乎一样的,如果我们对询问二中的每个aia_iai都存m−ai−1m - a_i - 1mai1的值,这个问题就变得跟上述问题是一样的了。

考虑如何快速解决这个问题(因为我们不能对每次询问都进行模拟),尝试二分求解:

假设我们当前二分区间为[l,r][l, r][l,r],判断答案是在[l,mid][l, mid][l,mid]或者[mid+1,r][mid + 1, r][mid+1,r]区间,所以我们需要判断x=mid+1x = mid + 1x=mid+1是否是可行的。

对于那些ai≥xa_i \geq xaix的数来说,如果每次删除我们都选他,可以发现对整个过程的模拟是没有影响的,假设这样的数有cntcntcnt个。

接下来我们的问题就转换成为,当所有数都<x< x<x,我们每次需要挑选k−cntk - cntkcnt个数然后对其−1-11,能否进行xxx次操作了。

我们再对这个问题进行转换,如果我们要进行xxx次操作,每次我们最多能选多少个数,如果每次可选的数≥k−cnt\geq k - cntkcnt,则说明合法。

由于ai<xa_i < xai<x,我们进行了xxx次操作,说明,我们可以满足在同一次操作中不会出现两个一样的,所以每次可选的数为sumx\frac{sum}{x}xsum

由此我们解决了,询问操作,如果是静态问题,可以考虑直接主席树上二分,但是这里是一个带修的问题,所以可以考虑树套树,

如果是树状数组套主席树,空间复杂度将会是O(nlog⁡2n)O(n \log ^ 2 n)O(nlog2n)的,不可行,所以得通过权值线段树套平衡树来解决,达到空间O(nlog⁡n)O(n \log n)O(nlogn)的。

其实还有一个代码量小,同时满足时间复杂度的离线做法,整体二分,空间O(n)O(n)O(n),时间O(nlog⁡2n)O(n \log ^ 2 n)O(nlog2n)

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, m, T, cnt, a[N];long long ans[N];inline int lowbit(int x) {return x & (-x);
}struct BIT {long long sum[N];void update(int rt, int x) {while (rt <= n) {sum[rt] += x;rt += lowbit(rt);}}long long query(int rt) {long long ans = 0;while (rt) {ans += sum[rt];rt -= lowbit(rt);}return ans;}
}sum, num;struct Res {int op, id, l, r, k;/*op = 0, modify a_l + rop = 1, query [l, r], k*/long long pre_sum, pre_num;}q[N << 2], ql[N << 2], qr[N << 2];void solve(int L, int R, long long l, long long r) {if (L > R) {return ;}if (l == r) {for (int i = L; i <= R; i++) {if (!q[i].op) {ans[q[i].id] = l;}}return ;}long long mid = l + r >> 1;int cnt1 = 0, cnt2 = 0;for (int i = L; i <= R; i++) {if (q[i].op) {if (q[i].r <= mid) {sum.update(q[i].l, q[i].r * q[i].op), num.update(q[i].l, q[i].op);ql[++cnt1] = q[i];}else {qr[++cnt2] = q[i];}}else {long long pre_sum = q[i].pre_sum, pre_num = q[i].pre_num;long long cur_sum = sum.query(q[i].r) - sum.query(q[i].l - 1), cur_num = num.query(q[i].r) - num.query(q[i].l - 1);if ((q[i].r - q[i].l + 1) - pre_num - cur_num + (pre_sum + cur_sum) / (mid + 1) >= q[i].k) {q[i].pre_sum += cur_sum, q[i].pre_num += cur_num;qr[++cnt2] = q[i];}else {ql[++cnt1] = q[i];}}}for (int i = 1; i <= cnt1; i++) {if (ql[i].op) {sum.update(ql[i].l, -ql[i].r * ql[i].op), num.update(ql[i].l, -ql[i].op);}}for (int i = 1; i <= cnt1; i++) {q[L + i - 1] = ql[i];}for (int i = 1; i <= cnt2; i++) {q[L + cnt1 + i - 1] = qr[i];}solve(L, L + cnt1 - 1, l, mid);solve(L + cnt1, R, mid + 1, r);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d %d", &n, &m, &T);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);a[i] = m - a[i] - 1;q[++cnt] = {1, 0, i, a[i], 0, 0, 0};}for (int i = 1, op; i <= T; i++) {ans[i] = -1;scanf("%d", &op);if (op & 1) {int l, r, k;scanf("%d %d %d", &l, &r, &k);q[++cnt] = {0, i, l, r, r - l + 1 - k, 0, 0};}else {int u, v;scanf("%d %d", &u, &v);q[++cnt] = {-1, 0, u, a[u], 0, 0, 0};a[u] = m - v - 1;q[++cnt] = {1, 0, u, a[u], 0, 0, 0};}}solve(1, cnt, 0, 100000000000000);for (int i = 1; i <= T; i++) {if (ans[i] != -1) {printf("%lld\n", ans[i]);}}return 0;
}

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

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

相关文章

漫画:程序员带娃日常(1)

我是一名IT界资深人士做过乙方苦哈哈做过甲方做过项目、搞点管理做过培训、也上台演讲不过现在最大挑战、交期最长的项目是。。。带 娃娃子啊&#xff0c;爸爸也是第一次当爸爸&#xff0c;要请你多多指教啦&#xff01;1“小刘&#xff0c;把这个需求细化一下。”“兄弟们&…

L. Coordinate Paper(CCPC 长春)构造

L. Coordinate Paper 构造一个长度为nnn的序列aaa&#xff0c;满足ai≥0a_i \geq 0ai​≥0&#xff0c;∑i1nais\sum\limits_{i 1} ^{n} a_i si1∑n​ai​s&#xff0c;对于任意的i∈[1,n−1]i \in [1, n - 1]i∈[1,n−1]&#xff0c;都有ai−ai1korai1−ai1a_i - a_{i 1} …

servlet生命周期

1.servlet的生命周期 主要有三个方法&#xff1a; init()初始化阶段service()处理客户端请求阶段destroy()终止阶段 初始化阶段&#xff1a; Servlet容器加载Servlet&#xff0c;加载完成后&#xff0c;Servlet容器会创建一个Servlet实例并调用init()方法&#xff0c;init(…

表达式树练习实践:入门基础

什么是表达式树来自微软官方文档的定义&#xff1a;表达式树以树形数据结构表示代码。它能干什么呢&#xff1f;你可以对表达式树中的代码进行编辑和运算。这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。好不好玩&#xff1f;表达式树还能用于动…

Servlet与线程安全

Servlet与线程安全 先说结论&#xff0c;Servlet本身是单例的&#xff0c;线程安全的。但是如果引入共享变量&#xff0c;则可能会变得线程不安全。 1. 什么是线程安全 首先说明一下对线程安全的讨论&#xff0c;哪种情况我们可以称作线程安全&#xff1f; 《Java并发编程实…

P3591 [POI2015]ODW(分块)

P3591 [POI2015]ODW 给定一颗有nnn个节点的树&#xff0c;点有点权&#xff0c;给定一个长度为nnn的排列ppp&#xff0c;给定一个长度为n−1n - 1n−1的数组ccc&#xff0c; 我们会在树上进行n−1n - 1n−1次行走&#xff0c;第iii次我们会从p[i]p[i]p[i]走到p[i1]p[i 1]p[i…

尝鲜体验 VS Code Python 原生 Jupyter Notebook 支持

9 月 21 日&#xff0c;PyCon China 2019 在上海举办。微软的 VS Code 发布了原生的Juypter Notebook 支持。 虽然要等到月底 Marketplace 里面才会正式更新&#xff0c;但 GitHub 上的 repo 已经包含了相应的 commit&#xff0c;所以还是可以通过手动安装的方式尝鲜。现有 VSC…

Java Web之filter、listener、Interceptor

** 1、Servlet ** Servlet 是服务端的 Java 应用程序&#xff0c;用于处理HTTP请求&#xff0c;做出相应的响应。 当客户端向服务器发出HTTP请求时&#xff0c;首先会由服务器中的 Web 容器&#xff08;如Tomcat&#xff09;对请求进行路由&#xff0c;交给该URL对应的 Servl…

L - Lookup Performance(主席树)

L - Lookup Performance 问对于一颗二叉搜索树来说&#xff0c;如果我们要找一个值域区间的值有多少个&#xff0c;他会向下递归查找几次&#xff0c; 设&#xff0c;第iii个节点所代表的最大最小值为li,ril_i, r_ili​,ri​&#xff0c;此时我们要查询L,RL, RL,R之间的值有多…

abp vNext微服务框架分析

abp vNext新框架的热度一直都很高&#xff0c;于是最近上手将vNext的微服务Demo做了一番研究。我的体验是&#xff0c;vNext的微服务架构确实比较成熟&#xff0c;但是十分难以上手&#xff0c;对于没有微服务开发经验的.net人员来说几乎是看不懂的&#xff0c;所以研究一番后再…

Java web之web.xml配置详解

什么是web.xml web.xml是web项目的配置文件&#xff0c;一般的web工程都会用到web.xml来配置&#xff0c;方便大型开发。web.xml主要用来配置Filter&#xff0c;Listener&#xff0c;Servlet等。但是web.xml并不是必须的&#xff0c;一个web工程可以没有web.xml文件。 web工程…

.NET Conf 2019日程(北京时间)

一年一度的 .NET Conf马上就要开始了,我将日程简易的翻译了一下,并且时间全部转换为北京时间,以方便国内.NETer.第1天 (北京时间9月24日).NET Conf 2019 基调 - Scott Hunter Mads Torgersen James Montemagno Olia Gavrysh Daniel Roth Glenn Condron Bri Achtman欢迎来到 .NE…

C - Swaps 2(树状数组,思维)

C - Swaps 2 给定两个长度为nnn的数组A,BA, BA,B&#xff0c;我们可以进行若干次如下操作&#xff0c;使AAA变成BBB&#xff0c; 选定i<ni < ni<n&#xff0c;将aia_iai​减小111&#xff0c;将ai1a_{i 1}ai1​增加111。交换ai,ai1a_i, a_{i 1}ai​,ai1​。 问我…

Hibernate基础

** 一、什么是Hibernate&#xff1f; **   Hibernate是一个轻量级的ORMapping框架   ORMapping原理&#xff08;Object Relational Mapping&#xff09; ORMapping基本对应规则&#xff1a; 1&#xff1a;类跟表相对应2&#xff1a;类的属性跟表的字段相对应3&#xff1…

进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 《进击的 Java &#xff0c;云原生时代的蜕变》, 本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。.NET 生态系统是一个不断变化的生态圈&#xff0c;我相信它正在朝着一个伟大的方向发…

F. Strange Array(Codeforces Round #727 (Div. 2))(主席树)

F. Strange Array 给定一个长度为nnn的数组aaa&#xff0c;1≤ai≤n1 \leq a_i \leq n1≤ai​≤n&#xff0c;对于每个aia_iai​&#xff0c;我们要找到一个l≤i,r≥il \leq i, r \geq il≤i,r≥i&#xff0c; 使得&#xff0c;我们对区间[l,r][l, r][l,r]升序后&#xff0c;…

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础&#xff0c;传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候&#xff0c;在默认情况下&#xff0c;返回的只是该对象的代理对象&#xff0c;当用户去使用该对象的属性时&#xff0c;才会向数据库再一次发出查询语…

程序员过关斩将--要想获取我的用户信息,就得按照规矩来

菜菜君&#xff0c;我又来啦又有什么事吗&#xff1f;我按照你上篇文章写的JWT的方式已经把网站认证写完了&#xff0c;而且效果还不错那恭喜你呀&#xff0c;下次面试又多了一项技能不过&#xff0c;现在又有一个问题&#xff0c;我做的系统有一个合作商想要利用我们的用户信息…

E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me! ∑i1n∑j1nϕ(aiaj)d(i,j)设paii∑i1n∑j1nϕ(ij)d(pi,pj)∑i1n∑j1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))gcd⁡(i,j)d(pi,pj)∑d1ndϕ(d)∑i1nd∑j1ndϕ(id)ϕ(jd)d(pid,pjd)[gcd⁡(i,j)1]∑d1ndϕ(d)∑k1ndμ(k)∑i1nkd∑j1nkdϕ(ikd)ϕ(jkd)d(pikd,pjkd)Tkd∑T1n(∑i1n…

Hibernate 的缓存机制

** 1、Hibernate 应用程序中按照缓存的范围&#xff0c;可以将缓存分为三类 ** &#xff08;1.1&#xff09;事务范围缓存&#xff08;单Session&#xff0c;即一级缓存&#xff09; 事务范围的缓存只能被当前事务访问&#xff0c;每个事务都有各自的缓存。缓存的生命周期依…