前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》
目录
一、0求和 - 蓝桥云课
算法代码:
代码思路概述
代码详细解释
数组定义
输入读取
前缀和计算部分
结果计算部分
输出结果
程序结束
总结
二、1.可获得的最小取值 - 蓝桥云课
算法代码:
代码思路概述
详细代码逻辑解释
输入初始化
读取数组元素
数组排序
前缀和计算
求最小值
输出结果
总结
三、P1811 - [NewOJ Week 5] 并行处理 - New Online Judge
算法代码:
代码思路
输入数组
计算前缀和
寻找最优分割点
输出结果
代码分析
时间复杂度
空间复杂度
适用场景
示例
总结
四、1.异或和之和 - 蓝桥云课
算法代码:
代码思路
输入数组
逐位计算贡献
累加结果
输出结果
代码分析
时间复杂度
空间复杂度
适用场景
示例
总结
1. 问题背景
什么是子数组?
什么是异或和?
2. 核心思想
3. 具体实现
前缀异或和
动态维护计数
为什么需要 zero 和 one?
4. 代码逻辑详解
外层循环:逐位计算贡献
初始化
内层循环:遍历数组
获取当前二进制位的值
更新前缀异或和
统计贡献
累加当前位的贡献
5. 示例
6. 总结
五、P2004 领地选择 - 洛谷
算法代码:
代码思路
输入矩阵和参数
计算前缀和矩阵
寻找最大子矩阵
输出结果
代码分析
时间复杂度
空间复杂度
适用场景
示例
总结
一、0求和 - 蓝桥云课
算法代码:
#include<stdio.h>int a[200010]; // 定义一个整数数组 a,最大长度为 200010
long long sum[200010]; // 定义一个长整型数组 sum,用于存储前缀和int main() {int n; // 定义变量 n,表示数组的长度scanf("%d", &n); // 从标准输入读取数组的长度 n// 读取数组元素并计算前缀和for(int i=1; i<=n; i++) {scanf("%d", &a[i]); // 读取数组 a 的第 i 个元素sum[i] = sum[i-1] + a[i]; // 计算前缀和:sum[i] 为前 i 个元素的和}long long s = 0; // 初始化结果变量 s 为 0,注意局部变量在使用前需初始化// 计算特定值 sfor(int i=1; i<=n; i++) {// s 加上 a[i] 乘以 sum[n](全数组和)减去 sum[i](前 i 个元素的和)s += a[i] * (sum[n] - sum[i]); // sum[n] - sum[i] 为 a[i] 后面所有元素的和}printf("%lld\n", s); // 输出计算的结果 s,格式为长整型return 0; // 程序正常结束
}
代码思路概述
-
输入处理: 读取整数数组的长度和数据。
-
前缀和计算: 使用前缀和数组存储从数组头到当前位置的累积和,以便后续快速计算。
-
结果计算: 根据前缀和数组计算特定的结果。
-
输出结果: 将计算的结果输出。
代码详细解释
-
数组定义
-
int a[200010];
:声明一个整数数组a
,用于存储数组的元素。 -
long long sum[200010];
:声明一个长整型数组sum
,用于存储前缀和,以便处理大数。
-
-
输入读取
-
scanf("%d", &n);
:读取用户输入的数组长度n
。
-
-
前缀和计算部分
-
for(int i=1; i<=n; i++)
:循环从 1 到n
,读取数组元素并计算前缀和。-
scanf("%d", &a[i]);
:读取第i
个元素并存储在数组a
中。 -
sum[i] = sum[i-1] + a[i];
:更新前缀和数组sum
,其中sum[i]
表示从a[1]
到a[i]
的总和。
-
-
-
结果计算部分
-
long long s = 0;
:初始化结果变量s
为 0。 -
for(int i=1; i<=n; i++)
:循环从 1 到n
,计算每个元素对最终结果的贡献。-
s += a[i] * (sum[n] - sum[i]);
:将当前元素a[i]
乘以其后所有元素的和(通过前缀和计算),并累加到s
中。sum[n]
是整个数组的和,sum[i]
是前i
个元素的和,所以sum[n] - sum[i]
是从a[i+1]
到a[n]
的和。
-
-
-
输出结果
-
printf("%lld\n", s);
:输出结果s
,注意格式为长整型。
-
-
程序结束
-
return 0;
:返回 0,表示程序正常结束。
-
总结
这段代码实现了通过前缀和的方式高效地计算数组中元素的特定总和,避免了重复计算,提升了效率。每一步都通过清晰的逻辑和注释展现了代码的目的和功能。
下面的代码思路是差不多的:
#include <iostream>
using namespace std;
typedef long long ll;
int a[200005];
int main()
{// 请在此输入您的代码int n;ll sum=0,ans=0;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);sum+=a[i];}for(int i=0;i<n;i++){sum-=a[i];ans+=a[i]*sum;}printf("%lld",ans);return 0;
}
二、1.可获得的最小取值 - 蓝桥云课
算法代码:
#include <bits/stdc++.h>
using namespace std;long long a[200010]; // 定义一个长整型数组 a,用于存储输入的数字
long long sum[200010]; // 定义一个长整型数组 sum,用于存储前缀和int main() {int n, k; // 定义变量 n(数组长度)和 k(操作参数)cin >> n >> k; // 从标准输入读取 n 和 k 的值// 读取数组元素for (int i = 1; i <= n; i++) {cin >> a[i]; // 读取第 i 个元素到数组 a 中}// 对数组进行排序sort(a + 1, a + 1 + n); // 从 a[1] 到 a[n] 排序// 计算前缀和for (int i = 1; i <= n; i++) {sum[i] = sum[i - 1] + a[i]; // sum[i] 存储从 a[1] 到 a[i] 的总和}long long ans = 1e18; // 初始化结果变量 ans 为一个很大的值,代表正无穷大// 计算最小值for (int p = 1; p <= k; p++) {// 计算一个特定的值并更新 ansans = min(sum[n] - sum[n + p - k] + sum[2 * p], ans);}cout << ans; // 输出结果 ansreturn 0; // 程序正常结束
}
代码思路概述
-
输入处理: 读取数组的长度
n
和参数k
,并填充数组。 -
排序: 对数组进行升序排序,以便后续计算。
-
前缀和计算: 计算前缀和,这样可以快速获得数组中任意区间的和。
-
计算特定值: 根据给定的条件和公式计算最小值。
-
输出结果: 将计算得到的最小值输出。
详细代码逻辑解释
-
输入初始化
-
定义长整型数组
a
和sum
,用于存储输入的数据和计算的前缀和。 -
读取用户输入的两个整数
n
(数组长度)和k
(控制参数)。
-
-
读取数组元素
-
使用循环读取
n
个元素到数组a
中。注意,数组从1
开始填充,这在一些 C++ 代码中是为了方便后续计算(通常使用1
为数组索引)。
-
-
数组排序
-
使用
sort
函数对数组a
进行升序排序,以便在后续的计算中能够利用排序后的结构。
-
-
前缀和计算
-
使用一个循环计算前缀和,
sum[i]
存储从a[1]
到a[i]
的总和。这样可以方便地在 O(1) 时间内计算任意区间的和。
-
-
求最小值
-
初始化结果
ans
为一个非常大的值(例如1e18
),以确保后续的比较能够更新这个值。 -
使用循环,遍历
p
从1
到k
,根据给定的公式计算每个p
对应的值,并更新最小值ans
。 -
sum[n] - sum[n + p - k] + sum[2 * p]
公式的具体含义可能与问题的特定定义有关,通常用于计算某种区间和的差异或者总和。
-
-
输出结果
-
最终,将计算得到的最小值
ans
输出。
-
总结
-
全局视角: 该代码实现了一个高效的算法,通过排序和前缀和来简化后续的计算。
-
时间复杂度: 整个过程的时间复杂度主要由排序决定,即 O(n log n),而前缀和计算和最小值查找都是 O(n) 的,因此整体复杂度是 O(n log n)。
-
空间复杂度: 使用了 O(n) 的额外空间来存储输入数组和前缀和数组。
-
适用场景: 此类算法适用于需要频繁计算区间和或求最值的问题,在处理大规模数据时尤其有效。
三、P1811 - [NewOJ Week 5] 并行处理 - New Online Judge
算法代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
long long sum[N];
int main()
{int n;cin >> n;for (int i = 1; i <= n; i++){int a;cin >> a;sum[i] = sum[i - 1] + a;}long long ans = sum[n];for (int i = 1; i <= n; i++){ans = min(ans, max(sum[i], sum[n] - sum[i]));}cout << ans << endl;return 0;
}
代码思路
-
输入数组
-
首先输入一个整数
n
,表示数组的长度。 -
然后输入
n
个整数,表示数组的元素。
-
-
计算前缀和
-
使用一个数组
sum
来存储前缀和,其中sum[i]
表示数组前i
个元素的和。 -
前缀和的计算公式为:
sum[i] = sum[i - 1] + a
,其中a
是当前输入的元素。
-
-
寻找最优分割点
-
初始化
ans
为整个数组的和sum[n]
。 -
遍历数组,尝试将数组分成两部分:前
i
个元素和后n - i
个元素。 -
对于每个分割点
i
,计算两部分的和:sum[i]
和sum[n] - sum[i]
。 -
取这两部分的最大值,并更新
ans
为所有最大值中的最小值。
-
-
输出结果
-
输出
ans
,即最优分割点对应的最大值的最小值。
-
代码分析
-
时间复杂度
-
计算前缀和的时间复杂度为 O(n)O(n)。
-
寻找最优分割点的时间复杂度为 O(n)O(n)。
-
总时间复杂度为 O(n)O(n)。
-
-
空间复杂度
-
使用了一个大小为 NN 的数组
sum
来存储前缀和,空间复杂度为 O(n)O(n)。
-
-
适用场景
-
这段代码适用于需要将数组分成两部分,并使得两部分的最大值最小化的问题。
-
例如,在任务分配问题中,可能需要将任务分成两组,使得两组的总工作量尽可能均衡。
-
示例
假设输入如下:
5
1 2 3 4 5
-
前缀和数组
sum
为:[0, 1, 3, 6, 10, 15]
。 -
遍历分割点:
-
i = 1
:max(1, 14) = 14
-
i = 2
:max(3, 12) = 12
-
i = 3
:max(6, 9) = 9
-
i = 4
:max(10, 5) = 10
-
i = 5
:max(15, 0) = 15
-
-
最小值为
9
,因此输出9
。
总结
这段代码的核心思想是通过前缀和快速计算任意子数组的和,然后遍历所有可能的分割点,找到使得两部分最大值最小化的最优解。代码实现简洁高效,适用于类似的问题场景。
四、1.异或和之和 - 蓝桥云课
算法代码:
#include <bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;vector<int> a(n);for (int i = 0; i < n; i++){cin >> a[i]; // 输入数组}long long ans = 0; // 初始化结果为 0for (int k = 0; k <= 20; k++) // 遍历每个二进制位{int zero = 1, one = 0; // 初始化前缀异或和为 0 和 1 的次数long long cnt = 0, sum = 0; // cnt 记录当前位的贡献,sum 记录前缀异或和for (int i = 0; i < n; i++) // 遍历数组{int v = (a[i] >> k) & 1; // 获取当前元素在第 k 位的值sum ^= v; // 更新前缀异或和if (sum == 0) // 如果前缀异或和为 0{zero++; // 增加 zero 的计数cnt += one; // 累加 one 的贡献}else // 如果前缀异或和为 1{one++; // 增加 one 的计数cnt += zero; // 累加 zero 的贡献}}ans += cnt * (1ll << k); // 将当前位的贡献累加到结果中}cout << ans; // 输出结果return 0;
}
代码思路
-
输入数组
-
首先输入一个整数
n
,表示数组的长度。 -
然后输入
n
个整数,表示数组的元素。
-
-
逐位计算贡献
-
对于每个二进制位
k
(从 0 到 20),计算该位对最终结果的贡献。 -
使用变量
sum
来记录当前前缀异或和。 -
使用变量
zero
和one
来记录前缀异或和为 0 和 1 的次数。 -
遍历数组,计算每个元素在当前二进制位上的值
v = (a[i] >> k) & 1
,并更新前缀异或和sum
。 -
根据
sum
的值,更新zero
和one
的计数,并累加当前位的贡献cnt
。
-
-
累加结果
-
将每个二进制位的贡献
cnt
乘以(1 << k)
,并累加到最终结果ans
中。
-
-
输出结果
-
输出
ans
,即所有子数组异或和的总和。
-
代码分析
-
时间复杂度
-
外层循环遍历每个二进制位,最多 21 次(0 到 20)。
-
内层循环遍历数组,时间复杂度为 O(n)O(n)。
-
总时间复杂度为 O(21×n)O(21×n),即 O(n)O(n)。
-
-
空间复杂度
-
使用了一个大小为 nn 的数组
a
,空间复杂度为 O(n)O(n)。
-
-
适用场景
-
这段代码适用于需要计算所有子数组异或和总和的问题。
-
例如,在统计数组中所有子数组的异或和时,可以通过逐位计算贡献来高效求解。
-
示例
假设输入如下:
3
1 2 3
-
对于每个二进制位
k
,计算贡献:-
k = 0
:-
子数组异或和在第 0 位的贡献为 4。
-
-
k = 1
:-
子数组异或和在第 1 位的贡献为 4。
-
-
k = 2
:-
子数组异或和在第 2 位的贡献为 0。
-
-
-
最终结果为 4×1+4×2+0×4=124×1+4×2+0×4=12。
总结
这段代码的核心思想是通过逐位计算每个二进制位对最终结果的贡献,从而高效地求解所有子数组异或和的总和。代码实现简洁高效,适用于类似的问题场景。
1. 问题背景
这段代码的目的是计算数组中所有子数组的异或和的总和。异或和是指一个子数组中所有元素的异或结果。我们需要对数组中所有可能的子数组计算异或和,然后将这些异或和相加,得到最终的结果。
什么是子数组?
子数组是数组中连续的一段元素。例如,数组 [1, 2, 3]
的子数组包括:
-
[1]
-
[2]
-
[3]
-
[1, 2]
-
[2, 3]
-
[1, 2, 3]
什么是异或和?
异或和是指一个子数组中所有元素的异或结果。例如:
-
子数组
[1, 2]
的异或和是1 ^ 2 = 3
。 -
子数组
[2, 3]
的异或和是2 ^ 3 = 1
。
2. 核心思想
为了高效计算所有子数组的异或和的总和,代码采用了逐位计算贡献的方法。具体来说:
-
对于每个二进制位(从第 0 位到第 20 位),计算该位对最终结果的贡献。
-
如果某个子数组的异或和在第 kk 位上是 1,那么该子数组对最终结果的贡献是 1×(1≪k)1×(1≪k)。
-
我们需要统计有多少子数组的异或和在第 kk 位上是 1,然后将这些贡献累加起来。
3. 具体实现
为了实现上述思想,代码使用了前缀异或和和动态维护计数的方法。
前缀异或和
-
前缀异或和
sum
表示从数组开头到当前位置的子数组的异或和。 -
例如,对于数组
[1, 2, 3]
:-
到第 1 个元素的前缀异或和是
1
。 -
到第 2 个元素的前缀异或和是
1 ^ 2 = 3
。 -
到第 3 个元素的前缀异或和是
1 ^ 2 ^ 3 = 0
。
-
动态维护计数
-
我们需要统计有多少子数组的异或和在第 kk 位上是 1。
-
为了实现这一点,代码维护了两个变量:
-
zero
:表示前缀异或和为 0 的次数。 -
one
:表示前缀异或和为 1 的次数。
-
为什么需要 zero
和 one
?
-
假设我们有两个位置 ii 和 jj(i<ji<j),如果前缀异或和在位置 ii 和位置 jj 的值相同(都是 0 或都是 1),那么从 i+1i+1 到 jj 的子数组的异或和为 0。
-
如果前缀异或和在位置 ii 和位置 jj 的值不同(一个是 0,另一个是 1),那么从 i+1i+1 到 jj 的子数组的异或和为 1。
因此,通过维护 zero
和 one
的计数,我们可以快速计算有多少子数组的异或和为 1。
4. 代码逻辑详解
以下是代码的核心逻辑,逐行解释:
外层循环:逐位计算贡献
for (int k = 0; k <= 20; k++)
-
遍历每个二进制位(从第 0 位到第 20 位)。
-
对于每个二进制位,计算该位对最终结果的贡献。
初始化
int zero = 1, one = 0;
long long cnt = 0, sum = 0;
-
zero
:初始化为 1,表示前缀异或和为 0 的次数(初始状态的前缀异或和为 0)。 -
one
:初始化为 0,表示前缀异或和为 1 的次数。 -
cnt
:记录当前二进制位的贡献。 -
sum
:记录当前的前缀异或和。
内层循环:遍历数组
for (int i = 0; i < n; i++)
-
遍历数组中的每个元素。
获取当前二进制位的值
int v = (a[i] >> k) & 1;
-
获取当前元素在第 kk 位上的值(0 或 1)。
更新前缀异或和
sum ^= v;
-
更新前缀异或和
sum
。
统计贡献
if (sum == 0)
{zero++;cnt += one;
}
else
{one++;cnt += zero;
}
-
如果
sum == 0
:-
当前前缀异或和为 0。
-
如果之前存在某个前缀异或和为 1 的位置,那么从那个位置到当前位置的子数组的异或和为 1。
-
因此,累加
one
的贡献到cnt
中。 -
同时,
zero
的计数加 1,因为当前前缀异或和为 0。
-
-
如果
sum == 1
:-
当前前缀异或和为 1。
-
如果之前存在某个前缀异或和为 0 的位置,那么从那个位置到当前位置的子数组的异或和为 1。
-
因此,累加
zero
的贡献到cnt
中。 -
同时,
one
的计数加 1,因为当前前缀异或和为 1。
-
累加当前位的贡献
ans += cnt * (1ll << k);
-
将当前二进制位的贡献
cnt
乘以 1≪k1≪k,并累加到最终结果ans
中。
5. 示例
假设数组为 [1, 2, 3]
,我们以第 0 位(最低位)为例:
-
二进制表示:
-
1
的第 0 位是1
。 -
2
的第 0 位是0
。 -
3
的第 0 位是1
。
-
-
计算过程:
-
初始化:
zero = 1
,one = 0
,sum = 0
,cnt = 0
。 -
遍历数组:
-
第 1 个元素
1
:-
v = (1 >> 0) & 1 = 1
。 -
sum = sum ^ v = 0 ^ 1 = 1
。 -
因为
sum == 1
,所以累加zero
的贡献:cnt += zero = 1
。 -
更新
one
:one = 1
。
-
-
第 2 个元素
2
:-
v = (2 >> 0) & 1 = 0
。 -
sum = sum ^ v = 1 ^ 0 = 1
。 -
因为
sum == 1
,所以累加zero
的贡献:cnt += zero = 2
。 -
更新
one
:one = 2
。
-
-
第 3 个元素
3
:-
v = (3 >> 0) & 1 = 1
。 -
sum = sum ^ v = 1 ^ 1 = 0
。 -
因为
sum == 0
,所以累加one
的贡献:cnt += one = 4
。 -
更新
zero
:zero = 2
。
-
-
-
-
最终,第 0 位的贡献为
cnt = 4
。
6. 总结
-
if
和else
中增加one
或zero
的贡献,是为了统计当前二进制位上有多少子数组的异或和为 1。 -
通过维护
zero
和one
的计数,可以快速计算这些子数组的数量,从而高效地计算每个二进制位对最终结果的贡献。 -
这种方法的本质是利用前缀异或和的性质,将问题转化为统计满足条件的子数组数量。
五、P2004 领地选择 - 洛谷
算法代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int a[N][N], s[N][N];int main()
{int n, m, c;cin >> n >> m >> c; // 输入矩阵的行数、列数和子矩阵的大小// 输入矩阵并计算前缀和矩阵for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){cin >> a[i][j]; // 输入矩阵元素s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]; // 计算前缀和}int Max = -1 << 30, x, y; // 初始化最大值和坐标// 遍历所有可能的子矩阵for (int x1 = 1; x1 <= n - c + 1; x1++)for (int y1 = 1; y1 <= m - c + 1; y1++){int x2 = x1 + c - 1, y2 = y1 + c - 1; // 计算右下角坐标// 计算子矩阵的元素和int ans = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];if (ans > Max) // 如果当前子矩阵的元素和更大{Max = ans; // 更新最大值x = x1, y = y1; // 更新左上角坐标}}cout << x << " " << y << endl; // 输出结果return 0;
}
代码思路
-
输入矩阵和参数
-
输入三个整数
n
、m
和c
,分别表示矩阵的行数、列数以及子矩阵的大小。 -
输入一个 n×mn×m 的矩阵
a
,表示矩阵的元素。
-
-
计算前缀和矩阵
-
使用一个二维数组
s
来存储前缀和矩阵,其中s[i][j]
表示从(1, 1)
到(i, j)
的子矩阵的元素和。 -
前缀和的计算公式为:
s[i][j]=s[i−1][j]+s[i][j−1]−s[i−1][j−1]+a[i][j]s[i][j]=s[i−1][j]+s[i][j−1]−s[i−1][j−1]+a[i][j]
-
-
寻找最大子矩阵
-
遍历所有可能的 c×cc×c 子矩阵的左上角坐标
(x1, y1)
。 -
对于每个左上角坐标
(x1, y1)
,计算对应的右下角坐标(x2, y2)
,其中x2 = x1 + c - 1
,y2 = y1 + c - 1
。 -
使用前缀和矩阵快速计算子矩阵的元素和:
ans=s[x2][y2]−s[x2][y1−1]−s[x1−1][y2]+s[x1−1][y1−1]ans=s[x2][y2]−s[x2][y1−1]−s[x1−1][y2]+s[x1−1][y1−1] -
如果当前子矩阵的元素和
ans
大于之前的最大值Max
,则更新Max
和对应的左上角坐标(x, y)
。
-
-
输出结果
-
输出最大子矩阵的左上角坐标
(x, y)
。
-
代码分析
-
时间复杂度
-
计算前缀和矩阵的时间复杂度为 O(n×m)O(n×m)。
-
遍历所有可能的子矩阵的时间复杂度为 O((n−c+1)×(m−c+1))O((n−c+1)×(m−c+1))。
-
总时间复杂度为 O(n×m)O(n×m)。
-
-
空间复杂度
-
使用了两个大小为 N×NN×N 的二维数组
a
和s
,空间复杂度为 O(n×m)O(n×m)。
-
-
适用场景
-
这段代码适用于需要在二维矩阵中快速查找某个固定大小的子矩阵,并计算其元素和的问题。
-
例如,在图像处理中,可能需要查找某个区域的最大亮度值。
-
示例
假设输入如下:
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
-
前缀和矩阵
s
为:1 3 6 10 6 14 24 36 15 33 54 78 28 60 96 136
-
遍历所有 2×22×2 的子矩阵:
-
左上角
(1, 1)
,元素和为 14。 -
左上角
(1, 2)
,元素和为 18。 -
左上角
(1, 3)
,元素和为 22。 -
左上角
(2, 1)
,元素和为 30。 -
左上角
(2, 2)
,元素和为 34。 -
左上角
(2, 3)
,元素和为 38。 -
左上角
(3, 1)
,元素和为 46。 -
左上角
(3, 2)
,元素和为 50。 -
左上角
(3, 3)
,元素和为 54。
-
-
最大子矩阵的左上角坐标为
(3, 3)
,元素和为 54。
总结
这段代码的核心思想是通过前缀和矩阵快速计算任意子矩阵的元素和,然后遍历所有可能的子矩阵,找到元素和最大的子矩阵。代码实现简洁高效,适用于类似的问题场景。
相关文章:
前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》
目录 一、0求和 - 蓝桥云课 算法代码: 代码思路概述 代码详细解释 数组定义 输入读取 前缀和计算部分 结果计算部分 输出结果 程序结束 总结 二、1.可获得的最小取值 - 蓝桥云课 算法代码: 代码思路概述 详细代码逻辑解释 输入初始化 …...
1.测试策略与计划设计指南
1.介绍 1.1项目介绍 完整项目组成:1.基于K8S定制开发的SaaS平台;2.多个团队提供的中台服务(微服务);3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后,自己搭建测试环境,…...
pikachu
暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程(非常详细)零基础入门到精通,看一篇就够了!让你挖洞事半功倍!_burpsuite使用教程-CSDN博客 登录页面,随意输入抓包,发送到攻击…...
HDFS扩缩容及数据迁移
1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理,决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表,这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...
设计模式-(状态模式,策略模式,代理模式,责任链模式)
状态模式 概念: 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为,从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中,每个状态类都定义了在该状态下对象的行为 状态模式主要涉…...
二、IDE集成DeepSeek保姆级教学(使用篇)
各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…...
通义灵码插件安装入门教学 - IDEA(安装篇)
在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…...
每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理
引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…...
qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试
qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试 code review! 文章目录 qt-C笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试1.Application(Qt):Qt Widgets Application1.1.qmake版本1.2.cmake版本 2.Application(Qt):Qt Console Applicati…...
【NestJS系列】安装官方nestjs CLI 工具
环境搭建指南:从零开始创建 NestJS 项目 一、工具准备 1. 安装 Node.js 环境 推荐使用 LTS 版本(目前 20.x 以上)验证安装:终端执行 node -v 和 npm -vNode.js 官网下载2. 包管理器选择 这里选用更高效的 pnpm,你也可选择 npm 或 yarn # 安装 pnpm npm install -g pnp…...
【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?
文章目录 **1. 确认依赖版本**示例依赖配置(Maven): **2. 处理 StaticLoggerBinder 的移除**解决方案: **3. 修改日志配置文件**示例 logback.xml 配置: **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...
【Linux C | 时间】localtime 的介绍、死机、死锁问题以及 localtime_r 函数的时区问题
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
每日一题——LRU缓存机制的C语言实现详解
LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...
虚函数表和虚函数表指针
1.虚函数表什么时候生成? 编译器编译的时候生成 2.虚函数表存放在哪里? 讨论两种情况:在磁盘(可执行程序)、在内存(运行状态) 3.虚函数表与虚函数表指针的关系 每个类只有一个虚函数&#x…...
计算机毕业设计SpringBoot+Vue.js图书进销存管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理
大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具,就好像是一个大管家,帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…...
【学写LibreCAD】1 LibreCAD主程序
一、源码 头文件: #ifndef MAIN_H #define MAIN_H#include<QStringList>#define STR(x) #x #define XSTR(x) STR(x)/*** brief handleArgs* param argc cli argument counter from main()* param argv cli arguments from main()* param argClean a list…...
CentOS7最小化安装中使用curl安装yum和wget
在 CentOS 7 最小化安装中,如果已经有curl工具,可以按照以下步骤使用它来安装yum和wget: 1. 备份原有的 yum 源配置文件 为了避免配置冲突或后续需要恢复,先备份原有的yum源配置文件。 mv /etc/yum.repos.d/CentOS-Base.repo /…...
【Linux】learning notes(3)make、copy、move、remove
文章目录 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…...
P10108 [GESP202312 六级] 闯关游戏
题目大意 如题 分析 设最佳通关方案为 { s 1 , s 2 , . . . , s k } \{s_1,s_2,...,s_k\} {s1,s2,...,sk},其中 s i s_i si 代表第 i i i 次到达的关卡( ≥ N \ge N ≥N 的不算)。 当 a k N − 1 a_kN-1 akN−1 时&#…...
Dubbo RPC 原理
一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架,支持服务治理、协议扩展、负载均衡、容错机制等核心功能,广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…...
网络安全 机器学习算法 计算机网络安全机制
(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…...
【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
确定执行机器和自定义工作目录(忽略节点的workspace) pipeline{agent {node {label "XXXXX"customWorkspace "E:/workspace/"}}parameters {}options {}stages {}post {} }仅确定执行机器 pipeline{agent { label "XXXXX&quo…...
Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
【万字长文】开源之播对话白鲸开源CEO郭炜--乐观主义的开源精神走得更远
本文为白鲸开源科技CEO郭炜1小时深度访谈全记录 来源于:开源之播」Episode15:对话郭炜–乐观主义的开源精神走得更远 大家好,我是郭炜,开源圈的“郭大侠”。作为 Apache 基金会的成员,我曾参与并孵化了多个开源项目,如…...
Verilog 位运算符和逻辑运算符的使用
Verilog 位运算符和逻辑运算符的使用 目录 前言 一、逻辑运算符 二、位运算符 总结 前言 本文详细描述了Verilog 逻辑运算符和位运算符的使用,随着编程的熟练,有时候总是喜欢混用它们,虽然能实现同样的功能,但最好还是注意一下…...
压测报告:DeepSeek-R1-Distill-Qwen-32B模型性能评估
1. 实验背景 本实验旨在评估DeepSeek-R1-Distill-Qwen-32B模型在特定硬件配置下的性能表现。测试硬件为GPU服务器。实验主要关注模型在不同并发请求数下的峰值生成速度。 吞吐量(Throughput): 测试模型在单位时间内可以处理多少请求,通常以“每秒生成的令牌数(tokens/s)…...
【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation
原文链接 摘要 近年来,CLIP 和 SAM 等基础模型在零样本异常分割 (ZSAS) 任务中展现出良好的性能。然而,无论是基于 CLIP 还是基于 SAM 的 ZSAS 方法,仍然存在不可忽视的关键缺陷:1) CLIP 主要关注不同输入之间的全局特征对齐&am…...
DeepSeek:面向效率与垂直领域的下一代大语言模型技术解析
本文将深入剖析DeepSeek模型的核心算法架构,揭示其在神经网络技术上的突破性创新,并与主流大模型进行全方位技术对比。文章涵盖模型设计理念、训练范式优化、应用场景差异等关键维度,为读者呈现大语言模型领域的最新发展图景。 一、DeepSeek…...
win32汇编环境,加速键的应用示例
;运行效果 ;win32汇编环境,加速键的应用示例 ;加速键,就是按某个键,开启某个功能。不用鼠标点来点去的东西。 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>…...
【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机
一、计算机网络分层结构 计算机网络分层结构 指将计算机网络的功能划分为多个层次,每个层次都有其特定的功能和协议,并且层次之间通过接口进行通信。 分层设计的优势: 模块化:各层独立发展(如IPv4→IPv6,…...
[Web 安全] 反序列化漏洞 - 学习笔记
关注这个专栏的其他相关笔记:[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01:反序列化漏洞 — 漏洞介绍 反序列化漏洞是一种常见的安全漏洞,主要出现在应用程序将 序列化数据 重新转换为对象(即反序列化)的过程中…...
每日一题——字母异位词分组
字母异位词分组 1. 问题描述示例提示 2. 解题思路具体步骤 3. 代码实现4. 代码解析(1)排序法(2)哈希表存储(3)动态内存分配(4)释放内存1. HASH_FIND_STR 的作用2. 宏的定义4. 详细解…...
力扣 807. 保持城市天际线(Java实现)
题目分析 给定一个二维数组,行列长度相等,要保持四个方向仍一观察高度不变的情况下,适当添加建筑高度,问最大高度增量和。所谓四个方向高度不变的增量,其实就是arr[i][j]与同i行最大值同j列最大值之间的最小值的差&…...
【视频2 - 4】初识操作系统,Linux,虚拟机
📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。…...
重启securecmd失败
重启securecmd失败 问题描述:KES集群部署工具中,节点管理里新增节点下一步报错无法检查securecmd端口进程情况,安装依赖包后再次下一步提示如下报错: 解决办法: [rootlocalhost cluster]# cd /home/kingbase/cluster…...
python学习四
python运算符与表达式 表达式: Python中的表达式是一种计算结果的代码片段。它可以包 含变量、运算符、常数和函数调用,用于执行各种数学、逻辑 和功能操作 算术运算符: 比较(关系)运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: 身份运算符 <...
LeetCode 236.二叉树的最近公共祖先
题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
react 中,使用antd layout布局中的sider 做sider的展开和收起功能
一 话不多说,先展示效果: 展开时: 收起时: 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…...
2025-02-26 学习记录--C/C++-C语言 整数格式说明符
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 C语言 整数格式说明符 【例如 】🎀 :在 C 语言中,%ld 是 printf 或 scanf 等格式化输入输出函…...
绕过过滤order by
一、常见绕过技术 1、注释符截断 利用注释符(如 --、#)截断后续查询,消除过滤逻辑的影响。 ORDER BY 1-- 若原查询为 SELECT * FROM table ORDER BY 用户输入,注入后可能忽略后续过滤逻辑。 2、大小写混淆/编码绕过 若过滤是大…...
NLP09-加强1-对比SVM
支持向量机(SVM) (一)导入 SVM 相关库 (二) 修改模型初始化 (三) 比较 朴素贝叶斯分类器 SVM分类器 支持向量机(SVM) 代码修改基于NLP09-朴素贝叶斯问句…...
STM32——HAL库开发笔记22(定时器3—呼吸灯实验)(参考来源:b站铁头山羊)
本文利用前几节所学知识来实现一个呼吸灯实验:两颗led灯交替呼吸。 一、STM32CubeMX配置 step1:配置调试接口 step2:配置定时器 定时器1位于APB2总线上,如上图所示。 step3:配置时基单元 按照下图配置 时钟来源配置…...
Vue3+TypeScript 封装一个好用的防抖节流自定义指令
一、前言:为什么需要防抖节流? 在前端开发中,高频触发的事件(如滚动、输入、点击等)容易导致性能问题。防抖(debounce) 和 节流(throttle) 是两种常用的优化手段&#x…...
2025年中国最新安防行业数字安全现状与未来趋势:内生安全成核心共识,从零基础到精通,收藏这篇就够了!
本次,我将为大家剖析由**安奇信发布的《中国安防行业数字安全建设与发展情况白皮书**》。该报告共_37_页,涵盖了众多重要信息和核心论点。若您希望深入了解,请参阅原报告,获取方法已在文档的最后部分提供。 报告核心内容 随着数字…...
项目管理的新理念主要有哪些
随着时代的发展和市场需求的变化,项目管理的理念也在不断地创新和演变。项目管理的新理念包括敏捷管理、精益管理、知识管理、变革管理、协作式管理和项目生命周期管理等。这些新理念不仅能够提高项目的管理效率,还能帮助团队在复杂的环境中更好地应对挑…...
Spring如何解决循环依赖?
一、Spring的三级缓存 关键就是提前暴露未完全创建完毕的Bean。 三级缓存来解决循环依赖: 一级缓存:用于存储完全初始化完成的单例Bean。 二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象&#x…...
vscode java环境中文乱码的问题
先说我的结论: 由于我的系统是windows的,所以vscode使用的是默认gbk的编码进行的。 但是我的目的是全部都使用utf-8,因为我的程序始终是要去linux上去运行的,总不能在本地是好的,然后到服务器上就不行了吧,…...
十、大数据资源平台功能架构
一、大数据资源平台的功能架构图总体结构 大数据资源平台功能架构图 关键组件: 1.用户(顶行) 此部分标识与平台交互的各种利益相关者。 其中包括: 市领导 各部门分析师 区政府 外部组织 公民 开发人员 运营经理 2.功能模…...