P2717 寒假作业(cdq分治)

news/2024/12/15 14:47:57/

P2717 寒假作业

题目传送门

文章目录

  • P2717 寒假作业
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
        • 样例 1 解释
        • 数据规模与约定
    • 思路
    • code

题目背景

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

题目描述

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

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

思路

我们把题意简化一下,就是求一个区间 [ l , r ] [l , r] [l,r] 满足 ∑ i = l r r − l + 1 ≥ k \frac{\sum_{i = l}^r}{r - l + 1} \ge k rl+1i=lrk 的数量。

我们可以推理一下:

首先我们如果把 a a a 数组全部减 k k k 那么上述式子就变成了: ∑ i = l r r − l + 1 ≥ 0 \frac {\sum_{i = l}^r}{r - l + 1} \ge 0 rl+1i=lr0

即: ∑ i = l r ≥ 0 \sum_{i = l}^r \ge 0 i=lr0

s s s 表示 a a a 数组的前缀和。

带入上述式子: s r − s l − 1 ≥ 0 s_r - s_{l - 1} \ge 0 srsl10

到这里题目就已经转换成了:求 i , j ( 1 ≤ i < j ≤ n ) i , j(1 \leq i < j \leq n) i,j(1i<jn) 满足 : s j ≥ s i s_j \ge s_i sjsi 的数量

也就是求 s s s 数组的顺序对的数量:

可以用归并排序或者树状数组来求。

不会归并排序的可以看这个

code

#include <bits/stdc++.h>
#define LL long long 
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
using namespace std;
const int N = 1e5 + 5;
int a[N] , s[N] , n , k;
LL ans;
int read () {int val = 0 , fu = 1;char ch = getchar ();while (ch < '0' || ch > '9') {if (ch == '-') fu = -1;ch = getchar ();}while (ch >= '0' && ch <= '9') {val = val * 10 + (ch - '0');ch = getchar ();}return val * fu;
}
void gb(int l , int r) {if (l == r) return;else {int mid = l + r >> 1;gb (l , mid);gb (mid + 1 , r);fu (i , l , r) a[i] = s[i];int i = l , j = mid + 1 , sum = l;while (i <= mid && j <= r) {if (a[i] <= a[j]) {ans += r - j + 1;s[sum ++] = a[i ++];}elses[sum ++] = a[j ++];}while (i <= mid) s[sum ++] = a[i ++];while (j <= r) s[sum ++] = a[j ++];}
}
int main () {n = read () , k = read ();fu (i , 1 , n) {a[i] = read ();a[i] -= k;}fu (i , 1 , n) s[i] = s[i - 1] + a[i];fu (i , 1 , n) ans += (s[i] >= 0);gb (1 , n);printf ("%lld" , ans);return 0;
}


http://www.ppmy.cn/news/57573.html

相关文章

PyCharm下载、安装、注册以及简单使用【全过程讲解】

在使用PyCharm IDE之前&#xff0c;请确保自己的计算机里面安装了Python解释器环境&#xff0c;若没有下载和安装可以看看我之前的文章>>>Python环境设置>>>或者还可以观看视频讲解。 注意&#xff1a;本文软件的配置方式仅供个人学习使用&#xff0c;如有侵…

redis 过期消息订阅实现(java实现)

一、开启redis消息通知功能 方法1: 修改conf文件 编辑/etc/redis/redis.conf文件&#xff0c;添加或启用以下内容&#xff08;key过期通知&#xff09;&#xff1a; notify-keyspace-events Ex方法2: 使用命令 登陆redis-cli输入下列命令 config set notify-keyspace-even…

【Java笔试强训 17】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;杨辉三角…

【算法】DFS计算四连通块个数

题目&#xff1a; 输入一个二维数组的row和col, 再输入这个二维数组&#xff0c;输出这个数组中包含的四连通块数量 四连通块是指一个数组数据, 其上下左右中有一个数字和它相等, 则这两个数连通, 属于一个连通块 示例输入&#xff1a; 7 7 0 0 0 0 0 0 0 0 1 1 1 1 2 0 0 3 …

作为一名程序员,如何写出一手让同事膜拜的漂亮代码?

整洁的代码 有意义的命名 函数命名 变量命名 函数的定义 注释的规范 代码的长度 代码的对齐 我写代码已经有好几年了&#xff0c;最近看了一本书叫做《代码整洁之道》。我发现这本书中介绍的一些内容对我来说非常有启发性。书中提到的一些方法和技巧让我重新审视了自己的…

浙大的SAMTrack,自动分割和跟踪视频中的任何内容

Meta发布的SAM之后&#xff0c;Meta的Segment Anything模型(可以分割任何对象)体验过感觉很棒&#xff0c;既然能够在图片上面使用&#xff0c;那肯定能够在视频中应用&#xff0c;毕竟视频就是一帧一帧的图片的组合。 果不其然浙江大学就发布了这个SAMTrack&#xff0c;就是在…

如何构建数据血缘系统

1、明确需求&#xff0c;确定边界 在进行血缘系统构建之前&#xff0c;需要进行需求调研&#xff0c;明确血缘系统的主要功能&#xff0c;从而确定血缘系统的最细节点粒度&#xff0c;实体边界范围。 例如节点粒度是否需要精确到字段级&#xff0c;或是表级。一般来说&#x…

[Pandas] 构建DataFrame数据框

DataFrame是二维数据结构&#xff0c;数据以行和列的形式排列 构建DataFrame最基本的定义格式如下 df pd.DataFrame(dataNone, indexNone, columnsNone) 参数说明 data: 具体数据 index: 行索引&#xff0c;如果没有指定&#xff0c;会自动生成RangeIndex(0,1,2,...,n) colu…