博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AtCoder Regular Contest 101 D - Median of Medians
阅读量:5295 次
发布时间:2019-06-14

本文共 1456 字,大约阅读时间需要 4 分钟。

二分答案

然后前缀和+树状数组来判断这个答案是否大于等于数

如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1
将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_{r}的组合

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;}

转载于:https://www.cnblogs.com/Basasuya/p/9572200.html

你可能感兴趣的文章
wordpress使用技巧
查看>>
HDU(2897)邂逅明下
查看>>
android压缩图片,解决oom错误
查看>>
分布式系统关注点(17)——先写DB还是「缓存」?
查看>>
JMS消息头
查看>>
linux 命令 改变指定目录以及其子目录下的所有文件的拥有者和群组
查看>>
动态查找树比较
查看>>
MapReduce的初次尝试
查看>>
thinkphp框架 中 ajax 的应用
查看>>
C/C++中程序在使用堆内存时的内存复用问题
查看>>
[置顶] SpecDD(混合的敏捷方法模型)主要过程概述
查看>>
JAVA排序(一) Comparable接口
查看>>
敏捷个人 - 敏捷个人价值观,欢迎提出你的意见和你的价值观
查看>>
iTerm2 + Oh My Zsh
查看>>
判断9X9数组是否是数独的java代码
查看>>
ExtJS学习之路第一步:对比jQuery,认识ExtJS
查看>>
Leetcode 268 Missing Number
查看>>
00-自测1. 打印沙漏
查看>>
UNITY在VS中调试
查看>>
福建省第八届 Triangles
查看>>