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

P2717 寒假作业 CDQ

寒假作业

传送门

题目背景

zzs 和 zzy 正在被寒假作业折磨,然而他们有答案可以抄啊。

题目描述

他们共有 n n n 项寒假作业。zzy 给每项寒假作业都定义了一个疲劳值 a i a_i ai,表示抄这个作业所要花的精力。

zzs 现在想要知道,有多少组连续的寒假作业的疲劳值的平均值不小于 k k k

简单地说,给定一个长度为 n n n 的正整数序列 { a i } \{a_i\} {ai},求出有多少个连续子序列的平均值不小于 k k k

输入格式

第一行是两个整数,分别表示序列长度 n n n 和给定的参数 k k k

第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i i 个数字 a i a_i ai

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

3 2
1
2
3

样例输出 #1

4

提示

样例 1 解释

共有 6 6 6 个连续的子序列,分别是 ( 1 ) (1) (1) ( 2 ) (2) (2) ( 3 ) (3) (3) ( 1 , 2 ) (1,2) (1,2) ( 2 , 3 ) (2,3) (2,3) ( 1 , 2 , 3 ) (1,2,3) (1,2,3),平均值分别为 1 1 1 2 2 2 3 3 3 1.5 1.5 1.5 2.5 2.5 2.5 2 2 2,其中平均值不小于 2 2 2 的共有 4 4 4 个。

数据规模与约定
  • 对于 20 % 20\% 20% 的数据,保证 n ≤ 100 n \leq 100 n100
  • 对于 50 % 50\% 50% 的数据,保证 n ≤ 5000 n \leq 5000 n5000
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 1 ≤ a i , k ≤ 1 0 4 1 \leq a_i,k \leq 10^4 1ai,k104

以上来自洛谷 以上来自洛谷 以上来自洛谷

解题思路

题目看不懂?确实题面可以转化为:求平均值大于等于k的区间个数。是不是想用 C D Q CDQ CDQ 了?我偏不用。

考虑暴力

枚举每个区间的右端点,枚举相应的区间。时间复杂度 O ( n 2 ) O(n^2) O(n2)

优化

对于平均值的处理,可以把 a i − k a_i-k aik,这样问题就转换为求出区间和大于等于0的区间个数
枚举右端点之后,考虑怎么快速求出左边区间和大于等于 0 0 0 的个数。
定义 t o t tot tot 表示当前以 i i i 为右端点的前缀和,用一个vector<int> sum维护当前右端点对应的所有左端点加 t o t tot tot 表示某段区间和。这样每次只要求出 s u m + t o t ≥ 0 sum+tot\ge 0 sum+tot0 的个数,很容易想到二分,可以手打,但有函数可以直接用。用lower__boundinsert保证插入后vector有序。考虑插入对于当前位置 j j j j j j i i i 的区间和,表示为 S u m i − S u m j − 1 Sum_i-Sum_{j-1} SumiSumj1。而 S u m j − 1 Sum_{j-1} Sumj1 就是当前枚举到j还没有加上 a j a_j aj t o t tot tot。时间复杂度 O ( n × n ) O(n\times \sqrt n) O(n×n ),这不就过了吗。

AC Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn = 4e5 + 5;
int n, k, a[Maxn];
vector<int> sum;
int tot;
int ans;
inline void work() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] -= k;}int tmp;for (int i = 1; i <= n; i++) {sum.insert(lower_bound(sum.begin(), sum.end(), -tot), -tot);tot += a[i];tmp = sum.end() - lower_bound(sum.begin(), sum.end(), -tot);ans += tmp;}cout << ans << endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);work();return 0;
}
//CDQ?

什么?你还想写 C D Q CDQ CDQ

相关文章:

  • GitHub Copilot 与 OpenAI ChatGPT 的区别及应用领域比较
  • 数据结构之顺序表的增删查改
  • 智能安全帽定制_基于联发科MT6762平台的智能安全帽方案
  • Spring Boot多环境配置
  • Winform使用Webview2(Edge浏览器核心)实现精美教程目录
  • PHP AES加解密示例【详解】
  • Qt 容器 Qlist
  • 伪装实例分割模型:OSFormer模型及论文解析
  • 51单片机定时器
  • Tomcat快速入门
  • Python基础之异常处理
  • springboot配置项动态刷新
  • 应用层—HTTPS详解(对称加密、非对称加密、密钥……)
  • 5G_系统同步机制(八)
  • JVM篇--垃圾回收器高频面试题
  • 「面试题」如何实现一个圣杯布局?
  • 230. Kth Smallest Element in a BST
  • css布局,左右固定中间自适应实现
  • export和import的用法总结
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java 多线程编程之:notify 和 wait 用法
  • js 实现textarea输入字数提示
  • JS专题之继承
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 区块链将重新定义世界
  • 通过几道题目学习二叉搜索树
  • 小程序button引导用户授权
  • 用Python写一份独特的元宵节祝福
  • 在Docker Swarm上部署Apache Storm:第1部分
  • No resource identifier found for attribute,RxJava之zip操作符
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • k8s使用glusterfs实现动态持久化存储
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​香农与信息论三大定律
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #1015 : KMP算法
  • (1)常见O(n^2)排序算法解析
  • (4.10~4.16)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十三)Maven插件解析运行机制
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (轉貼) UML中文FAQ (OO) (UML)
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .jks文件(JAVA KeyStore)
  • .NET Core 中插件式开发实现
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 反射 Reflect
  • .NET 回调、接口回调、 委托
  • .NET4.0并行计算技术基础(1)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题