cf1486 D. Max Median - 判断是否存在一个区间和大于0
时间:2021-04-22
本文章向大家介绍cf1486 D. Max Median - 判断是否存在一个区间和大于0,主要包括cf1486 D. Max Median - 判断是否存在一个区间和大于0使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给出一个数组,长度是n,对于区间,长度至少为k
求最大区间中位数
传送门
用二分去求。
对于某个数字判断是否是中位数:
首先肯定的是大于等于中位数数的数的数字比小于中位数的数字要来的大。
那么就求出前缀和
如果这个数字比中位数小,那么权值就是-1,否则就是1
然后只需要去判断是否存在一个区间长度大于等于k的,并且该区间长度的权值和大于0
遍历数组,假设我当前区间是以i为右区间,然后在i - k之前找到最小值,如果说我前缀和-最小值大于0,那么答案就是存在一个区间。
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define CASE int Kase = 0; cin >> Kase; for(int kase = 1; kase <= Kase; kase++)
using namespace std;
template<typename T = long long> inline T read() {
T s = 0, f = 1; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
while(isdigit(ch)) {s = (s << 3) + (s << 1) + ch - 48; ch = getchar();}
return s * f;
}
#ifdef ONLINE_JUDGE
#define qaq(...) ;
#define qwq(c) ;
#else
#define qwq(a, b) for_each(a, b, [=](int x){cerr << x << " ";}), cerr << std::endl
template <typename... T> void qaq(const T &...args) {
auto &os = std::cerr;
(void)(int[]){(os << args << " ", 0)...};
os << std::endl;
}
#endif
const int N = 2e5 + 5, M = 1e6 + 5, MOD = 1e9 + 7, CM = 998244353, INF = 0x3f3f3f3f; const ll linf = 0x7f7f7f7f7f7f7f7f;
int a[N];
int pre[N];
bool check(int mid, int n, int k) {
for(int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + (a[i] >= mid ? 1 : -1);
}
int mi = INF, mx = 0;
for(int i = k; i <= n; i++) { // 查看是否存在一个区间满足前缀和大于0,也就是说,x > y
mi = min(mi, pre[i - k]);
mx = max(mx, pre[i] - mi);
}
return mx > 0;
}
void solve(int kase){
int n = read(), k = read();
for(int i = 1; i <= n; i++) a[i] = read();
int l = 1, r = INF;
for(int i = 1; i <= 100; i++) {
int mid = (l + r) >> 1;
if(check(mid, n, k)) l = mid;
else r = mid;
}
printf("%d\n", l);
}
/*
大于等于a的数的个数x
小于a的数的个数y
那么一定存在x > y
n是奇数的时候:
x = y + 1
n是偶数的时候:
x = y + 2
想法就是去判断十分存在一个区间,满足前缀和大于0
*/
const bool ISFILE = 0, DUO = 0;
int main(){
clock_t start, finish; start = clock();
if(ISFILE) freopen("/Users/i/Desktop/practice/in.txt", "r", stdin);
if(DUO) {CASE solve(kase);} else solve(1);
finish = clock();
qaq("\nTime:", (double)(finish - start) / CLOCKS_PER_SEC * 1000, "ms\n");
return 0;
}
原文地址:https://www.cnblogs.com/Emcikem/p/14691388.html
- 关小刷刷题08 – Leetcode 26. Remove Duplicates from Sorted Array 方法2、3
- C++课程设计类作业2
- C++课程设计类作业4
- [接口测试 - 基础篇] 01 你应该了解的协议基础
- 代码分享系列(1)之感知机【代码可下载】
- C++课程设计类作业3
- [快学Python3]INI文件读写
- 【专知-PyTorch手把手深度学习教程08】NLP-PyTorch: 用字符级RNN生成名字
- Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)
- BZOJ 2456: mode(新生必做的水题)
- 【专知-PyTorch手把手深度学习教程07】NLP-基于字符级RNN的姓名分类
- Codeforces Round #301 (Div. 2)(A,【模拟】B,【贪心构造】C,【DFS】)
- 【专知-PyTorch手把手深度学习教程06】NLP-Word Embedding快速理解与PyTorch实现: 图文+代码
- [linux][memory]memcmp几种实现和性能对比
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python深层解析json数据之JsonPath
- Linux 下的 pstack 工具安装及简单应用
- range函数小应用
- 今日算法题,请查收
- 如何将根证书预置到 firefox 浏览器发布包中
- Vue + Flask 实战开发系列(九)
- 推荐几款快速管理 Kubernetes 多集群环境的神器
- 1. 初识Jackson -- 世界上最好的JSON库
- 实时应用程序中checkpoint语义以及获取最新offset
- Python2.6低版本Python如何实现爬虫功能
- python开发web服务 bottle框架
- 这样设置 IDEA,让你爽到飞起!
- GO 切片实力踩坑
- BeautifulSoup解析html介绍
- 微信会被封?!包子 Leetcode 1512 solution Number of Good Pairs