当前位置: 首页 > java >正文

cf | Median Splits

题目:

总结一下主要逻辑

  1. 映射

    • 把数组元素变成 1 或 -1
    • 1 表示「好元素」(小于等于 k),-1 表示「坏元素」。
  2. 前缀和:构建前缀和数组,方便快速计算子段的「好元素数量 - 坏元素数量」。

  3. 找位置分割

    • 维护一个最小前缀和的位置 pos
    • 当前 i 时,判断:
      • 从 pos+1 到 i 这段区间,好元素数量 ≥ 坏元素数量(即子段和非负)。
      • 或者,从 i+1 到 n 的区间,好元素数量 ≥ 坏元素数量
  4. 反转数组再做一遍:因为可以 l、r 不一定是左边小、右边大,所以反过来做一次,避免漏掉情况。

  5. 输出结果:有符合条件的分割就输出 YES,否则输出 NO


额外小贴士:

  • 为什么把 <=k 的映射成 1

    因为要求的是三个子段的中位数 ≤ k,如果子段里面好元素数量 ≥ 坏元素数量,那么中位数更容易是小的数。
  • 为什么要反转?

    因为分 l 和 r 的位置可以不固定,反转保证左右两边都能正确判断。

代码:

无注释版:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],s[N];
void solve(){int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]<=k) a[i]=1;else a[i]=-1;}for(int op=1;op<=2;op++){reverse(a+1,a+n+1);for(int i=1;i<=n;i++){s[i]=s[i-1]+a[i];}int pos=-1;for(int i=1;i<n;i++){if(pos>=0)if(s[i]-s[pos]>=0||s[n]-s[i]>=0) {cout<<"YES\n";return;}if(s[i]>=0){if(pos==-1||s[i]<s[pos]) pos=i;}}}cout<<"NO\n";
}
int main(){int t;cin>>t;while(t--){solve();}
}

有注释版:

#include<bits/stdc++.h> // 包含所有标准库
using namespace std;const int N=2e5+10; // 定义最大数组大小(保证足够大)
int a[N],s[N]; // a[] 是原数组,s[] 是前缀和数组// 单组数据处理
void solve(){int n,k;cin>>n>>k; // 读入数组长度 n 和目标值 k// 读入数组元素,同时进行映射for(int i=1;i<=n;i++){cin>>a[i];if(a[i]<=k) a[i]=1; // 小于等于 k 的元素映射为 1(好元素)else a[i]=-1;       // 大于 k 的元素映射为 -1(坏元素)}// 做两遍:原数组一遍、翻转数组一遍for(int op=1;op<=2;op++){reverse(a+1,a+n+1); // 将 a[1] 到 a[n] 整个数组翻转// 计算前缀和 s[i],s[0]=0for(int i=1;i<=n;i++){s[i]=s[i-1]+a[i];}int pos=-1; // 初始化一个位置,记录当前最小的前缀和下标// 枚举 l 位置for(int i=1;i<n;i++){ // 注意 i 只到 n-1,因为 r < nif(pos>=0){// 如果之前存在 pos,并且 [pos+1, i] 这段区间的和 >=0// 或者 [i+1, n] 这段区间的和 >=0if(s[i]-s[pos]>=0 || s[n]-s[i]>=0) {cout<<"YES\n"; // 找到了符合条件的分割,输出 YESreturn;}}// 更新 pos:找一个前缀和最小的位置(用于维护 s[i]-s[pos])if(s[i]>=0){if(pos==-1 || s[i]<s[pos]) pos=i;}}}// 如果遍历完两遍还没找到符合条件的分割cout<<"NO\n";
}int main(){int t;cin>>t; // 读入组数while(t--){solve(); // 每组数据调用 solve 处理}
}
http://www.xdnf.cn/news/2228.html

相关文章:

  • Dubbo(78)Dubbo的集群容错机制是如何实现的?
  • Ollama平替!LM Studio本地大模型调用实战
  • 509. 斐波那契数
  • 集合及相关
  • 什么是 Swagger 以及如何在 Spring Boot 中实现 Swagger:配置与实践指南
  • 【黑马JavaWeb+AI知识梳理】前端Web基础01 - HTML+CSS
  • 【leetcode100】单词拆分
  • C++:位图
  • 【Charles】抓包工具安装配置unknown问题解决
  • 《人件》第三章 正确的人
  • 在Windows11中配置Git+SSH环境,本此实践使用Gitee(码云),方法同样适用于其它绝大部分Git服务
  • Linux-进程控制
  • 安服实习面试面经总结(也适合hvv蓝初)
  • Linux渗透测试
  • x修改ssh版本号9.9可以躲过漏洞扫描器扫描
  • JAVA---字符串
  • 通过门店销售明细表用SQL得到每月每个门店的销冠和按月的同比环比数据
  • 可视化性能分析工具火焰图
  • function,bind,lambda的用法
  • Claude系列模型-20250426
  • Android12源码编译及刷机
  • JavaWeb——案例(14/x)- 文件上传-阿里云OSS-准备(阿里云 OSS 简介、使用阿里云 OSS 的流程、关键准备工作)
  • 【含文档+PPT+源码】基于Django框架的乡村绿色农产品交易平台的设计与实现
  • DeepSeek预训练追求极致的训练效率的做法
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
  • 818协议知识笔记
  • ShaderToy学习笔记 03.多个形状和旋转
  • DHCP配置文件详解
  • 解决conda虚拟环境安装包却依旧安装到base环境下
  • AEB法规升级后的市场预测与分析:技术迭代、政策驱动与产业变革