AtCoder Regular Contest 101 D - Median of Medians
2024-08-28 15:40:42
二分答案
然后前缀和+树状数组来判断这个答案是否大于等于数
如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1
将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_{r}的组合
#include <assert.h>
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
typedef long long ll;
int A[N];
int B[N];
int C[N];
ll tree[N * 2];
int n;
void Add(int pos, int num) {
for (int i = pos; i <= 2 * n; i += i & -i) tree[i] += num;
}
ll Sum(int pos) {
ll ans = 0;
for (int i = pos; i > 0; i -= i & -i) ans += tree[i];
return ans;
}
bool solve(int x) {
memset(tree, 0, sizeof(tree));
for (int i = 1; i <= n; ++i) {
if (A[i] >= x)
C[i] = 1;
else
C[i] = -1;
}
ll ans = 0;
Add(n, 1);
for (int i = 1; i <= n; ++i) {
C[i] += C[i - 1];
ans += Sum(C[i] + n);
Add(C[i] + n, 1);
}
// printf("%d\n", ans);
return (ans >= (1ll * n * (n + 1) / 4));
}
int main() {
while (~scanf("%d", &n)) {
for (int i = 1; i <= n; ++i) {
scanf("%d", &A[i]);
B[i] = A[i];
}
sort(B + 1, B + n + 1);
int tot = unique(B + 1, B + n + 1) - B - 1;
int l = 1;
int r = tot;
while (l <= r) {
int mid = (l + r) >> 1;
if (solve(B[mid]))
l = mid + 1;
else
r = mid - 1;
}
// for(int i = 1; i <= tot; ++i) printf("%d ", B[i]); printf("\n");
printf("%d\n", B[r]);
}
return 0;
}
最新文章
- 机器学习笔记----四大降维方法之PCA(内带python及matlab实现)
- Hypernetes简介
- 纯CSS实现tooltip提示框,CSS箭头及形状之续篇--给整个tooltip提示框加个边框
- BZOJ 3110 树套树 &;&; 永久化标记
- Sql Server数据的加密与解密
- [python学习笔记] 开篇
- NEERC训练实录
- C语言实现过滤ASCII在0~127范围内的字符,并去除重复的字符
- Elasticsearch实践(四):IK分词
- sys用户的操作
- PythonStudy——赋值运算符 Assignment operator
- js中遇到的一些方法和函数
- 利用Python实现FGO自动战斗脚本,再也不用爆肝啦~
- 安装nvm管理不同的node版本
- git 管理 Linux 文件系统
- javascript 获取元素样式的方法
- Java RSA 生成公钥 私钥
- Python 中的函数
- C# 音频操作系统项目总结
- 2018-2019-2 20165332《网络攻防技术》Exp5 MSF基础应用