F. Strange Array

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

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

我们分两种情况讨论:

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

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

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

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

综上我们对这两个答案取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;
}

F. Strange Array(Codeforces Round #727 (Div. 2))(主席树)相关推荐

  1. Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的数组,对每个位置iii求一个最大价值,价值计算方式如下:选择一个包含iii的[l,r][l,r][l,r],让后将其拿出来排序,之后价值 ...

  2. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  3. Codeforces Round #727 (Div. 2)2021.6.20

    Codeforces Round #727 (Div. 2) 闲话:打完省赛打cf,很不在状态地硬撑,wa和t了几次挺傻的地方,d题五分钟云出思路脑抽了调不出来.最后c还fst了.可以算的我拿去whi ...

  4. Codeforces Round #727 (Div. 2) 题解

    文章目录 A. Contest Start B. Love Song C. Stable Groups D. PriceFixed E. Game with Cards F. Strange Arra ...

  5. Codeforces Round #727 div.2 A-F题解

    视频讲解:BV15M4y1g7cf A. Contest Start 题目大意 有 nnn 名选手参加比赛,第 iii 名选手的比赛在 (i−1)∗x(i-1)*x(i−1)∗x 时刻开始,持续 tt ...

  6. Codeforces Round #727 (Div. 2)

    A. Contest Start There are n people participating in some contest, they start participating in x min ...

  7. 贪心 双指针----Codeforces Round #727 (Div.2) D. PriceFixed

    题目链接 题目大意: 市场上有 nnn 种商品,每种商品的价格都是 222 .现在你需要买第 iii 种商品 a[i]a [ i ]a[i] 件.但是对于第 iii 种商品有一个属性 bbb ,意味着 ...

  8. A. Arithmetic Array Codeforces Round #726 (Div. 2)

    A. Arithmetic Array An array b of length k is called good if its arithmetic mean is equal to 1. More ...

  9. Codeforces Round #727 (Div. 2) A~D题

    Codeforces提交链接 A题:Contest Start 题意: k组样例. 每行3个整数,n,x,t. n个人考试. 第1个人在 0 时刻开始考试, 第2个人在 x 时刻开始考试, 第3个人在 ...

最新文章

  1. TinyML-TVM是如何驯服Tiny的(下)
  2. scala类型推断及库方法设计原则和==与java有何差别
  3. java 字符过滤器_Java Web---登录验证和字符编码过滤器
  4. SVN插件版本过低1.6的已经不兼容现在新版的eclipse 了用 1.8X的吧
  5. 曼格短视频小程序V1.8.5版本完整源码
  6. PCRE正则表达式语法
  7. python实现排队论模型_Logistic模型拟合COVID-19疫情以及Python实现
  8. python post 请求登录后的页面_python - 学习模拟登录,卡在发送POST请求之后?
  9. Linux内核分析——进程的描述和进程的创建
  10. aws rds监控慢sql_AWS RDS SQL Server中的本机差异备份概述
  11. 【机器学习】无监督学习:PCA和聚类
  12. 新华三杯考前突击---Day2---IPV6技术篇
  13. SpringBoot Spring Cloud项目学习汇总
  14. 大数据开发岗面试30天冲刺 - 日积月累,每日五题【Day01】——Hive1
  15. 【Coding】LSF作业系统查看bsub提交历史
  16. android 黑色透明背景,解决Android png透明图片转jpg时背景变黑的问题
  17. 优秀网页翻译:一个智能旋钮:DIY haptic input knob: BLDC motor + round LCD
  18. 用四位数码管和DS3231时钟模块做车载电子时钟
  19. 计算机保研夏令营准备流程建议
  20. 数字人民币解决中小企收付难点

热门文章

  1. nginx 下配置使用Thinkphp5解决跨目录活动并且设置网站根目录
  2. linux nginx线程池,nginx使用线程池提升9倍性能
  3. 软件测试技术——系统测试
  4. 这五部关于海洋的纪录片,每一帧都犹如壁纸!
  5. 地球不是圆的,别让教科书限制了孩子的想象力!
  6. 如何交到一个女朋友?
  7. 一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳
  8. 围棋天才柯洁怒怼央视国际记者,用实力斩获清华大学免试资格
  9. 技巧:Excel用得好,天天没烦恼
  10. linux+4.4+android,Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法