The 2024 ICPC Asia East Continent Online Contest (I) G
Link: The Median of the Median of the Median
考虑二分答案,对中位数进行二分,每次去判断是否比中位数大即可。
我们钦定了一个中位数 \(x\),对于 \(\{a\}\) 数组,若 \(a_i \ge x\),则令 \(a_i = 1\),否则 \(a_i = 0\),这样有一个好处,我们只关心 \(1\) 和 \(0\) 的数量,就可以知道中位数是否比 \(x\) 大。
如果 \(\{a\}\) 中 \(1\) 的个数多于 \(0\) 的个数,说明中位数大于等于 \(x\),否则中位数小于 \(x\)。
考虑对所有的 \(\{b_{i,j}\}_{l\le{i}\le{j}\le{r}}\) 求值,不妨枚举左端点 \(l\),求出一个以 \(l\) 为左端点的 \(\{b_{i,j}\}_{l\le{i}\le{j}\le{r}}\) 的中位数,我们通过前缀和可以求出有多少个数是大于 \(x\) 的。
设 \(cnt[i][j]\) 表示以 \(i\) 为左端点,所有 \(i \le k \le j\) 的 \(b_{i, k}\) 大于等于 \(x\) 的个数,\(pre[0/1]\) 表示 \(a[i \sim j]\) 中 \(0/1\) 的数量,容易发现:
\]
考虑如何计算 \(\{c_{l, r}\}_{1\le{l}\le{r}\le{n}}\),我们枚举 \(r\),对所有 \(1 \le l \le r\) 求和,因为我们计算的 \(cnt[i][j]\) 是以左端点固定的,因此计算一对 \((l, r)\) 时,对 \(l\) 求 \(cnt[i][r]\) 的后缀和即可,不过因为 \(cnt[i][j]\) 表示的是一个段,因此,\(0\) 的个数变化 \(j - i + 1 - cnt[i][j]\),\(1\) 的个数变化 \(cnt[i][j]\),对答案贡献 \(1\) 当且仅当每个段 \(1\) 的个数大于 \(0\) 的个数。
当 \(1\) 的个数大于 \(0\) 时,说明中位数大于等于 \(x\),二分答案即可。
时间复杂度 \(O(n^2\log{|a|})\)。
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++ ) cin >> a[i];
auto check = [&](int x) -> int {
vector<int> b(n + 1);
vector<vector<int>> cnt(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i ++ ) b[i] = (a[i] >= x);
for (int i = 1; i <= n; i ++ ) {
vector<int> pre(2);
for (int j = i; j <= n; j ++ ) {
pre[b[j]] ++ ;
cnt[i][j] = cnt[i][j - 1] + (pre[1] > pre[0]);
}
}
vector<int> sum(2);
for (int i = 1; i <= n; i ++ ) {
vector<int> pre(2);
for (int j = i; j; j -- ) {
pre[1] += cnt[j][i];
pre[0] += i - j + 1 - cnt[j][i];
sum[pre[1] > pre[0]] ++ ;
}
}
return sum[1] > sum[0];
};
int l = 1, r = 1e9;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << r << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
solve();
return 0;
}
The 2024 ICPC Asia East Continent Online Contest (I) G的更多相关文章
- 训练20191009 2018-2019 ACM-ICPC, Asia East Continent Finals
2018-2019 ACM-ICPC, Asia East Continent Finals 总体情况 本次训练共3小时20分钟,通过题数4. 解题报告 D. Deja vu of - Go Play ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing(dp)
题目链接: http://codeforces.com/gym/102056/problem/I 题意: 人物有l两个属性分别是$A,D$ 每个回合人物$A\pm D$ 每个回合有三个选择分别是: 1 ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals部分题解
C:显然每p2个数会有一个0循环,其中22 32 52 72的循环会在200个数中出现,找到p2循环的位置就可以知道首位在模p2意义下是多少,并且循环位置几乎是唯一的(对72不满足但可能的位置也很少) ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals Solution
D. Deja vu of … Go Players 签. #include <bits/stdc++.h> using namespace std; int t, n, m; int m ...
- 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017) Solution
A:Chat Group 题意:给出一个n, k 计算C(n, k) -> C(n,n) 的和 思路:k只有1e5 反过来想,用总的(2^ n) 减去 C(n, 0) -> C(n, k ...
- The 2017 ACM-ICPC Asia East Continent League Final记录
首先感谢tyz学弟的麻麻-给我们弄到了名额- 然后就开始了ACM ECLFinal的玩耍,A*仙人掌可是立了flag要好好打的- 试机赛好像就全是GCJ kickstart的原题,然后AK了但是由于一 ...
- Codeforces Gym 101775D Mr. Panda and Geometric Sequence(2017-2018 ACM-ICPC Asia East Continent League Final,D题,枚举剪枝)
题目链接 ECL-Final 2017 Problem D 题意 给定$2*10^{5}$组询问,每个询问求$l$到$r$之间有多少个符合条件的数 如果一个数小于等于$10^{15}$, 并且能被 ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest
题解: https://files.cnblogs.com/files/clrs97/19HKEditorial-V1.zip Code:(Part) A. Axis of Symmetry #inc ...
- 2018-2019 ACM-ICPC, Asia East Continent Final L Eventual … Journey
#include<iostream> using namespace std; ; int cnt[MAX]; int ans[MAX]; int a[MAX]; int main() { ...
- 训练20191005 2017-2018 ACM-ICPC Asia East Continent League Final
A 签到 M 签到 K 读懂后签到 L 博弈论 [引理]出现SXXS结构时后手必胜. 很容易发现n为奇数时后手不可能胜利,n为偶数时先手不可能胜利.n≤6时一定平局,n≥7时先手有可能胜利,n≥16时 ...
随机推荐
- get方法传参后端接收数据异常 - 特殊字符需转义
get方法传参的时候,如果有特殊字符,如 + 等,无法被识别,导致后端处理异常,所以,get方式,如果有特殊字符,需要转义后再请求接口 1.java 特殊字符转义 URLEncoder.encode( ...
- 全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法
全网最适合入门的面向对象编程教程:44 Python 内置函数与魔法方法-重写内置类型的魔法方法 摘要: 在 Python 中,内置类型的行为是通过一组特殊的"魔法方法"来实现的, ...
- rabbitmq高可用集群搭建
需求分析基本情况 在进行RabbitMQ搭建时,我们基于现有的连接数据和业务需求进行了深入分析.目前的统计数据显示,连接数为631,队列数为80418.为了确保业务需求的顺利满足,我们需要在云产品和自 ...
- Linux firewalld 的用法
大乌龙事件之防火墙作祟: 在我的初始化环境中 selinux.iptables.firewalld 是关闭的, 莫名的firewalld 是没有关闭的这是我在安装完docker后一段时间后部署jenk ...
- SQL全表扫描优化基础知识
1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的 ...
- 鸿蒙应用开发:如何与组件库(Glide)衔接?
Android 发展到现在不仅提供了很多 API,还提供了很多第三方库.这降低了我们开发者的开发难度,提升了开发效率,让应用开发更加的简单高效.众所周知,HarmonyOS 除了提供 16000 ...
- 前端微服务qiankun 2.x主子应用通信代码片段
主应用代码 主应用工程里面源代码新建qiankun/index.js,通信代码如下: import { initGlobalState } from "qiankun"; impo ...
- 深度解读:Spring.3版本自动装配机制的演变与实践
前言 今天,我们将开启对Spring-AI系列源码的讲解.请大家不急不躁,我会逐步深入,每次专注于一个知识点,以防让人感到困惑. 首先,源码的讨论自然离不开自动装配.有人可能会问,之前已经讲解过这个内 ...
- 在Activity中测量控件宽高的三种方式
在进行Android开发时,有时需要测量控件的宽和高,常用的方式有以下三种: (1)重写onWindowFocusChanged(hasFocus: Boolean)方法,在这个方法内获取控件的宽高 ...
- TEN Framework 入坑记
TL;DR TEN Framework 最初叫 Astra,后改为 TEN,即 Transformative Extensions Network. 我第一次见到 TEN (那时还叫 Astra)是在 ...