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

F. Strange Array

给定一个长度为nnn的数组aaa1≤ai≤n1 \leq a_i \leq n1ain,对于每个aia_iai,我们要找到一个l≤i,r≥il \leq i, r \geq ili,ri

使得,我们对区间[l,r][l, r][l,r]升序后,值为aia_iai的数与中位数相隔最远,输出这个最远距离。

我们分两种情况讨论:

  • aia_iai在中位数的左边,也就是ai≤a_i \leqai中位数,我们考虑把aj≥aia_j \geq a_iajai的设置为111,其他都设置为−1-11

    则我们就是要对每个iii找到一个区间[l,r][l, r][l,r],使得区间和最大,假设这个区间和为xxx,则答案即为x2\frac{x}{2}2x

  • aia_iai在中位数的右边,也就是ai≥a_i \geqai中位数,我们考虑把aj≤aia_j \leq a_iajai的设置为111,其他设置为−1-11

    则我们就是要对每个iii找到一个区间[l,r][l, r][l,r],使得区间和最大,假设这个区间和为xxx,则答案即为x+12−1\frac{x + 1}{2} - 12x+11

综上我们对这两个答案取maxmaxmax即可,至于对值的维护,我们可以考虑用主席树维护区间左、右最大和即可。

#include <bits/stdc++.h>using namespace std;const int N =2e5 + 10;int root[N], ls[N << 5], rs[N << 5], num;int a[N], ans[N], n;vector<int> P[N];struct Res {int lsum, sum, rsum;
}T[N << 5];Res operator + (Res a, Res b) {return {max(a.lsum, a.sum + b.lsum), a.sum + b.sum, max(a.rsum + b.sum, b.rsum)};
}void push_up(int rt) {T[rt] = T[ls[rt]] + T[rs[rt]];
}void build(int &rt, int l, int r) {rt = ++num;if (l == r) {T[rt] = {1, 1, 1};return ;}int mid = l + r >> 1;build(ls[rt], l, mid);build(rs[rt], mid + 1, r);push_up(rt);
}void update(int &rt, int pre, int l, int r, int x, int v) {rt = ++num, ls[rt] = ls[pre], rs[rt] = rs[pre];if (l == r) {T[rt] = {v, v, v};return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}push_up(rt);
}Res query(int rt, int l, int r, int L, int R) {if (l >= L && r <= R) {return T[rt];}int mid = l + r >> 1;if (L <= mid && R > mid) {return query(ls[rt], l, mid, L, R) + query(rs[rt], mid + 1, r, L, R);}else if (L <= mid) {return query(ls[rt], l, mid, L, R);}else {return query(rs[rt], mid + 1, r, L, R);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);P[a[i]].push_back(i);}build(root[1], 1, n);for (int i = 2; i <= n; i++) {root[i] = root[i - 1];for (auto it : P[i - 1]) {update(root[i], root[i], 1, n, it, -1);}}for (int i = 1; i <= n; i++) {int lsum = 0, rsum = 0, sum = 1;if (i != 1) {lsum = query(root[a[i]], 1, n, 1, i - 1).rsum;}if (i != n) {rsum = query(root[a[i]], 1, n, i + 1, n).lsum;}if (lsum > 0) {sum += lsum;}if (rsum > 0) {sum += rsum;}ans[i] = max(ans[i], sum >> 1);}for (int i = 1; i <= num; i++) {ls[i] = rs[i] = 0;}for (int i = 1; i <= n; i++) {root[i] = 0;}num = 0;build(root[n], 1, n);for (int i = n - 1; i >= 1; i--) {root[i] = root[i + 1];for (auto it : P[i + 1]) {update(root[i], root[i], 1, n, it, -1);}}for (int i = 1; i <= n; i++) {int lsum = 0, rsum = 0, sum = 1;if (i != 1) {lsum = query(root[a[i]], 1, n, 1, i - 1).rsum;}if (i != n) {rsum = query(root[a[i]], 1, n, i + 1, n).lsum;}if (lsum > 0) {sum += lsum;}if (rsum > 0) {sum += rsum;}ans[i] = max(ans[i], (sum + 1) / 2 - 1);}for (int i = 1; i <= n; i++) {printf("%d%c", ans[i], i == n ? '\n' : ' ');}return 0;
}

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

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

相关文章

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;每个事务都有各自的缓存。缓存的生命周期依…

.NET分布式大规模计算利器-Orleans(一)

写在前面Orleans是基于Actor模型思想的.NET领域的框架&#xff0c;它提供了一种直接而简单的方法来构建分布式大规模计算应用程序&#xff0c;而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans&#xff0c;当时公司的交易系统采用的架构就是基于Orl…

吉哥系列故事——恨7不成妻(数位 DP)

吉哥系列故事——恨7不成妻 ∑i1n(presuc)2∑i1npre2suc22presucnpre2∑suc22pre∑suc\sum_{i 1} ^{n}(pre suc) ^ 2\\ \sum_{i 1} ^{n} pre ^ 2 suc ^ 2 2 \times pre \times suc\\ n \times pre ^ 2 \sum suc ^ 2 2 \times pre \sum suc\\ i1∑n​(presuc)2i1∑n​pre…

Hibernate与MyBatis对比

1、Hibernate与MyBatis简单介绍 Hibernate 是当前最流行的O/R mapping框架&#xff0c;它来自于 sf.net&#xff0c;现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网&#xff1a;http://www.mybat…

Hive-DML详解(超详细)

文章目录 前言HiveQL的数据操作语言&#xff08;DML&#xff09;1. 插入数据1.1 直接插入固定值1.2 插入查询结果 2. 更新数据3. 删除数据3.1 删除整个分区 4. 查询数据4.1 基本查询4.2 条件筛选4.3 聚合函数 总结 前言 本文将介绍HiveQL的数据操作语言&#xff08;DML&#x…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份&#xff0c;受限于HTTP无状态的特性&#xff0c;应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端&#xff0c;客户端在接下来的请求中携带通行证&#xff0c;然后服务端通过校验该通行证…

P5175 数列(矩阵快速幂)

P5175 数列 anb(xan−1yan−2)2x2an−12y2an−222xyan−1an−2x2an−12y2an−222xyan−2(xan−2yan−3)x2an−12y2an−222xy(xan−22yan−2an−3)a_n ^ b \left(x \times a_{n - 1} y \times a_{n - 2}\right) ^ 2\\ x ^ 2 \times a_{n - 1} ^ 2 y ^ 2 \times a_{n - 2} ^ 2…

Spring bean 的初始化

先mark&#xff1a; https://www.cnblogs.com/yxh1008/p/6012230.html Bean的多种初始化、destory方法执行顺序 https://segmentfault.com/a/1190000014105687 https://blog.csdn.net/caihaijiang/article/details/8629725 Spring bean的初始化过程 https://www.jianshu.com…

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说&#xff0c; 作为开发人员经常需要根据条件灵活查询数据库&#xff0c;不管你是用rawsql 还是EFCore&#xff0c; 以下类似伪代码大家都可能遇到&#xff1a;特别是在大数据产品或者物联网产品中&#xff0c;字段甚多&#xff1b;if/else 写到死&#xff0c;一边写…

Spring bean 初始化顺序

InitializingBean, init-method 和 PostConstruct 1、概述 从接口的名字上不难发现&#xff0c;InitializingBean 的作用就是在 bean 初始化后执行定制化的操作。 Spring 容器中的 Bean 是有生命周期的&#xff0c;Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特…

不要666升级版(数位DP,三次方和)

不要666升级版 ∑(presuc)2npre22pre∑suc∑suc2\sum(pre suc) ^ 2\\ n \times pre ^ 2 2 \times pre \sum suc \sum suc ^ 2\\ ∑(presuc)2npre22pre∑suc∑suc2 ∑(presuc)3∑(pre33pre2suc3presuc2suc3)npre33pre2∑suc3pre∑suc2∑suc3\sum (pre suc) ^ 3\\ \sum \left…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演&#xff0c;主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序&#xff0c;如果您是游戏…

Spring AOP实现原理

先说结论&#xff1a; Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时&#xff0c;采用JDK动态代理&#xff0c;否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心&#xff0c;整个软件系统由系列相互依赖的对象所组成&#xff0c…

J. Product of GCDs(莫比乌斯反演)(2021牛客暑期多校训练营2)

Product of GCDs ∏d1nd∑[gcd⁡(s1d,s2d,…,skd)1]∏d1nd∑i1ndμ(i)Cf[id]k\prod_{d 1} ^{n} d ^{\sum[\gcd(\frac{s_1}{d}, \frac{s_2}{d}, \dots, \frac{s_k}{d}) 1]}\\ \prod_{d 1} ^{n} d ^{\sum\limits_{i 1} ^{\frac{n}{d}} \mu(i) C_{f[id]} ^{k}}\\ d1∏n​d∑[g…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者&#xff0c;推出了一套免费的教程视频。这套视频名为 Python for Beginners&#xff0c;该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解&#xff0c;在课程中加…

徒手实现Spring的IOC

Mark https://www.jianshu.com/p/9fe5a3c25ab6 https://juejin.im/post/5abe75f351882577b45f2336 https://blog.csdn.net/u012373815/article/details/74937913 https://xilidou.com/2018/01/08/spring-ioc/ IOC原理介绍&#xff1a; http://www.importnew.com/14751.htm…

HDU6956-Pass!(2021杭电多校一)(BSGS)

Pass! f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2)f(1) 0, f(2) n - 1, f(t) (n - 2) \times f(t - 1) (t - 1) \times f(t - 2)f(1)0,f(2)n−1,f(t)(n−2)f(t−1)(t−1)f(t−2)&#xff0c;考虑对通项两边同时加一个xf(t−1)x \times f(t - 1)xf(t−1)。 可以得到f(t…