情景导入有时,我们需要求一个数组的最大子数组和(即连续子数组的和最大),并给出这个和(别问为什么,问就是题目要)。
Kadane 算法的原理首先,我们获得一个数组,并定义两个变量 csum 和 smax 。然后,我们可以开始 kadane 算法。
在算法开始时,将 csum(当前连续子段的和)初始化为数组的第一个元素,将 smax(全局最大子段和)也初始化为该值。接下来,从第二个元素开始,依次向右遍历整个数组。
对于每一个元素 a[i],我们要判断:如果当前的 csum 加上 a[i] 小于 a[i] ( csum 小于 0),说明前面的子段对总和是负贡献,继续加下去只会让后续的结果更小,所以应当舍弃之前的子段,从当前位置重新开始,也就是令 csum = a[i]。否则,如果 csum 仍然大于等于 0,就说明它对后续仍有正向贡献,我们可以安全地把当前元素加上去,csum += a[i]。
每处理完一个元素,就更新全局最大值:smax = max(smax, csum)。这样,smax 始终保存着从开头到当前位置为止出现过的最大连续子段和。
当遍历完整个数组后,smax 就是整个数组的 ...
前言11 月 1 号,CSP 将开始第二轮的考试(机试),也在此提前祝大家取得自己满意的成绩
第二轮需要用到 NOI-linux 系统,但很多考生第一次接触这个系统,就算已经看过很多遍教程,到了考场上,可能还会紧张,慌乱间忘记教程。那么,你就很有必要来看一看这篇博客
本篇博客教你在你自己的电脑(以 windows11 做示范)中安装虚拟机和 noi-linux 系统,顺带使用教程
开始安装 Vmwarenoi-linux 系统需要在虚拟机环境中运行,这里我用的是 vmware。
进入 vmware 官网,选择适合你的版本,下载安装程序
下载完成后,运行安装程序,配置的话按你自己的需求来。安装
安装完成以后,进入下一步
下载 NOI-linux 映像文件在 官网 下载 NOI-linux 的映像文件
注意,你下载的不是虚拟机,是系统的映像文件,vmware 需要通过映像文件创建虚拟机
安装 NOI-linux 虚拟机打开 vmware ,点击 创建新的虚拟机 ,映像文件中选择你下载的 NOI-linux 映像文件。然后剩下的配置按照你自己的喜好和电脑物理配置来,但注意不要给太低配置, ...
线段树简介什么是线段树线段树是一种数据结构,通常用于处理区间范围内的查询和更新问题。它的主要优点是能够以对数时间复杂度处理区间查询与区间更新。我们通常使用结构体(或数组)来模拟线段树的数据结构。
线段树能干什么线段树主要有两个基本操作:
区间查询(例如:区间求和、区间最值、区间最大公约数等): 时间复杂度为 O(log n)。
区间更新(例如:区间加法、区间赋值等): 时间复杂度为 O(log n)。
线段树比树状数组更强大,因为它支持区间更新,而树状数组仅支持单点更新或单点查询。
洛谷 P3372【线段树 1】例题讲解题目描述:
给定一个长度为 n 的数组 a[],支持两种操作:
区间加法:对区间 [l, r] 中的每个元素增加一个常数 k。
区间求和:查询区间 [l, r] 中所有元素的和。
线段树解决方案我们可以使用线段树来解决此问题,其中:
每个节点存储一个区间的和(例如:区间 [l, r] 的和)。
每个节点还存储一个懒标记(add),用于记录该区间需要被加上的常数值。
关键操作
懒标记(Lazy Propagation):为了优化区间更新操作,使用懒标记 ...
树状数组介绍是什么一种统计数据的方式(结构为数组)
用处大数据的 点增 & 前缀和
上手实操基本代码初始化 lowbit 点增前缀和全部1234// ------------初始化------------const int N;// 范围int n;ll tr[N];123456789101112// -----------lowbit------------inline int lowbit(int x){return x & -x;}// 求x在二进制下是1的位数的最低位/** * x = 11001000 , lowbit(x) = 4 * ~~~~^~~~ * * x = 10010010 , lowbit(x) = 2 * ~~~~~~^~ * */123456// ------------ 点增 ------------void add(int x,int k){// 第x个数加上k for(int i=1;i<=x;i+=lowbit(i)){ tr[i]+=k; }}12345678//------ ...
关于 ST 表用于ST 表(即稀疏表,以下称 ST 表)可以用于频繁求区间最值的问题,普通算法每次请求复杂度为 O(n),ST 表预处理复杂度为 O(n+m) ,每次请求复杂度为 O(1)
原理ST 表是将一个数组二分成很多小段,每一段求一个最值。若给出两个端点( l,r ),一定可以给出两个 ST 表中预处理过的区间,使得这两个区间覆盖了 l,r 间所有的端点,此时将这两个预处理过的区间的最值取一个最值,即可求得 l,r 间的最值
练习 & 实战题目模板题
题目描述
P1816 忠诚题目描述老管家是一个聪明能干的人。他为财主工作了整整 $10$ 年。财主为了让自已账目更加清楚,要求管家每天记 $k$ 次账。由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚。他把每次的账目按 $1, 2, 3, \ldots$ 编号,然后不定时地问管家这样的问题:在 $a$ 到 $b$ 号账中最少的一笔是多少?为了让管家没时间作假,他总是一次问 ...
2025 年 CSP - J / CSP - S 全题解析
注:本文为赛后解析汇总,题目与答案主要参考公开的赛题 / 解析。
目录 (S 组还没写完)
CSP - J(初赛 / 普及组)
单项选择题(1–15)
阅读程序(若干)
编程题(简要思路)
CSP - J(普及组) — 逐题解析一、单项选择题(15 题)下面按题号给出题目要点、正确选项与详细推导(尽量把常见误解、易错点都写清楚)。
1. 32 位无符号整数能表示的最大值最接近哪个选项?
答案:A
理由:32 位无符号整数范围是
10 ~ 2^{32} - 1 = 4294967295
约等于 $$ 4.294967295\times10^9 $$ ,最接近选项 A(约 $$ 4.29\times10^9 $$ )。
2. C++ 中 int x = 255; cout << (x & (x-1)); 的输出?
答案:B(254)
理由:255 的二进制是 11111111(低 8 位),x-1 为 11111110,按位与得 11111110 即 254。常见技巧:x & ...
前言本教程以 win11 电脑为本地环境,netlify + zeabur 为云环境,目前可做到除域名外全免费
点击打开
网上有很多教程,当然也有很多自称详细的教程,但是我认为仍然有些点不够详细易懂,而且有些点较为罗嗦,评论后又无人应答。所以,我将在本期博客写一个详细的、长期维护的教程
步骤准备账号及云服务一个常用邮箱(github 账号用邮箱注册,其他账号均使用 github 账号注册)
一个github 账号
一个netlify 账号
一个zeabur 账号
一个域名(可选,推荐)
一个提供域名解析的 DNS 服务器
其他git(可选, 强烈推荐 ,已配置好的。可以参考其他教程)
一个在你电脑中的文件夹,需保证你有足够权限(即增删改查)
npm 包管理器(可在 cmd 输入 npm -v 来确认)
开始初始运行首先,打开 cmd ,输入:
1234npm install hexo-cli -ghexo init blogcd blognpm install
然后 ...
Markdown 测试文件标题与段落一级标题 (H1)这是一个一级标题二级标题 (H2)这是一个二级标题三级标题 (H3)这是一个三级标题四级标题 (H4)这是一个四级标题五级标题 (H5)这是一个五级标题六级标题 (H6)这是一个六级标题段落与换行这是一个普通段落。在 Markdown 中,段落之间通过空行分隔。
这是另一个段落,展示如何使用 \\ 进行强制换行。例如这样。
强调与样式加粗文本这是加粗文本 或者 这是加粗文本
斜体文本这是斜体文本 或者 这是斜体文本
加粗并斜体这是加粗并斜体的文本 或者 这是加粗并斜体的文本
删除线这是删除线文本
列表无序列表
无序列表项 1
无序列表项 2
子列表项 1
子列表项 2
无序列表项 3
有序列表
有序列表项 1
有序列表项 2
子列表项 1
子列表项 2
有序列表项 3
混合列表
无序列表项 1
有序子列表项 1
有序子列表项 2
无序列表项 2
链接与图片超链接这是一个 链接。
带标题的链接:链接标题。
图片
链接到图片
代码行内代码使用 code 标签可以创建行内代码:print("Hello, World!") ...