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\) 的数量,容易发现:

\[cnt[i][j] = cnt[i][j - 1] + [pre[1] > pre[0]]
\]

考虑如何计算 \(\{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的更多相关文章

  1. 训练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 ...

  2. 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 ...

  3. 2018-2019 ACM-ICPC, Asia East Continent Finals部分题解

    C:显然每p2个数会有一个0循环,其中22 32 52 72的循环会在200个数中出现,找到p2循环的位置就可以知道首位在模p2意义下是多少,并且循环位置几乎是唯一的(对72不满足但可能的位置也很少) ...

  4. 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 ...

  5. 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 ...

  6. The 2017 ACM-ICPC Asia East Continent League Final记录

    首先感谢tyz学弟的麻麻-给我们弄到了名额- 然后就开始了ACM ECLFinal的玩耍,A*仙人掌可是立了flag要好好打的- 试机赛好像就全是GCJ kickstart的原题,然后AK了但是由于一 ...

  7. 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}$, 并且能被 ...

  8. 2019-2020 ICPC Asia Hong Kong Regional Contest

    题解: https://files.cnblogs.com/files/clrs97/19HKEditorial-V1.zip Code:(Part) A. Axis of Symmetry #inc ...

  9. 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() { ...

  10. 训练20191005 2017-2018 ACM-ICPC Asia East Continent League Final

    A 签到 M 签到 K 读懂后签到 L 博弈论 [引理]出现SXXS结构时后手必胜. 很容易发现n为奇数时后手不可能胜利,n为偶数时先手不可能胜利.n≤6时一定平局,n≥7时先手有可能胜利,n≥16时 ...

随机推荐

  1. armbian指令大全

    修复缺失内容 使用以下命令修复安装时缺失的内容: sudo apt --fix-broken install 使用 aptitude 安装软件 aptitude 是 Debian 及其衍生系统中功能强 ...

  2. Playwright 浏览器窗口最大化

    实现方式 浏览器启动时,加参数 args=['--start-maximized']: 创建上下文时,加参数 no_viewport=True. from playwright.sync_api im ...

  3. 阿里云 SLS 模糊查询日志

    查询包含test前缀的词 1. 访问 https://sls.console.aliyun.com/lognext/profile 2. 在Project列表中找到对应的sls日志Project 3. ...

  4. Go语言中的交互式CLI开发:survey库简介

    在构建命令行工具时,良好的用户交互体验至关重要.尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙.github.com/AlecAivazis/survey/v2 是一个为 ...

  5. 通过 maven 命令来查看 jar 包的引用关系

    通过 maven 命令来查看 jar 包的引用关系 1.可以通过maven命令来查看jar包的引用关系 mvn dependency:tree -Dverbose -Dincludes=org.cod ...

  6. [JS设计模式]:策略模式及应用-计算奖金、表单验证的实现(5)

    介绍 策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.此模式让算法的变化不会影响到使用算法的客户. 实现 举一个例子,比如我们做数据合法性校验,一般是通过swich来实现 ...

  7. JavaScript – Web Worker

    前言 在上一篇 << 单线程 与 执行机制 >> 中, 我们提到了 Web Worker. 它的诞生是为了解决 JS 主线程执行耗时计算时, 导致 UI 无法及时更新的卡死现象 ...

  8. JavaScript习题之选择题

    console.log( (2==true)+1 )会弹出A trueB falseC 1D 2正确答案: C2 ==true为假,此时值为0 在JS中,"1555"+3的运行结果 ...

  9. C++ string类型常用操作

    string类型操作 字符串切割 str.substr(索引,切割的个数)  ->  返回字符串 注意:第二个参数为切割的个数 string buf = "abcdefg"; ...

  10. Tomcat——基本使用(下载、安装、卸载、启动、关闭)

    Tomcat--基本使用   1.下载安装(8.5版本为企业最常用版本)     下载地址:https://tomcat.apache.org/download-80.cgi          (官网 ...