文章目录

    • 零、引入:分部积分
    • 一、Abel 变换
      • 1.1 Abel 变换
      • 1.2 证明
    • 二、一些比较浅显的应用
      • 2.1 等差 乘 等比型求和
      • 2.2 平方求和公式
      • 2.3 不等式证明
    • 三、一些算法题的式子优化
      • 3.1 3500.将数组分割为子数组的最小代价
      • 3.2 D. Array Splitting
      • 3.3 300. 任务安排1


零、引入:分部积分

img

我们不难表示出上图中 的面积 A1 和 A2
A 1 = ∫ y 1 y 2 x d y A 2 = ∫ x 1 x 2 y d x A 1 + A 2 = x 2 y 2 − x 1 y 1 ∫ x d y + ∫ y d x = x y ∫ x d y = x y − ∫ y d x \begin{align} & A1 = \int_{y_1}^{y_2} xdy \\ & A2 = \int_{x_1}^{x_2} ydx \\ & A_1 + A_2 = x_2y_2 - x_1y_1\\ & \int xdy + \int ydx = xy \\ & \int xdy = xy - \int ydx \end{align} A1=y1y2xdyA2=x1x2ydxA1+A2=x2y2x1y1xdy+ydx=xyxdy=xyydx
这也是我们常用的 分部积分公式

一、Abel 变换

1.1 Abel 变换

Abel变换,又称为Abel分部求和(summation by parts),相当于分部积分离散版本

它有如下表示:
∑ i = m n a i b i = A n b n − ∑ i = m n − 1 A i ( b i + 1 − b i ) 其中, A i = ∑ k = m i a k \begin{align} & \sum_{i=m}^{n} a_ib_i = A_nb_n - \sum_{i=m}^{n-1}A_i(b_{i+1} - b_i) \\ & 其中,A_i = \sum_{k=m}^{i}a_k \end{align} i=mnaibi=Anbni=mn1Ai(bi+1bi)其中,Ai=k=miak

1.2 证明

可以直接式子变形来推导:
∑ i = m n a i b i = ∑ i = m n ( A i − A i − 1 ) b i = A n b n − A n − 1 b n + A n − 1 b n − 1 − A n − 2 b n − 2 + . . . + A m + 1 b m + 1 − A m b m + 1 + A m b m = A n b n − ∑ i = m n − 1 A i ( b i + 1 − b i ) \begin{align} & \ \ \ \ \ \sum_{i=m}^{n} a_ib_i \\ &= \sum_{i=m}^{n} (A_i - A_{i-1})b_i \\ &= A_n b_n - A_{n-1}b_n + A_{n-1}b_{n-1} - A_{n-2}b_{n-2} + ... + A_{m+1}b_{m+1} - A_{m}b_{m+1} +A_{m}b_m \\ &= A_nb_n - \sum_{i=m}^{n-1} A_i(b_{i+1} - b_i) \end{align}      i=mnaibi=i=mn(AiAi1)bi=AnbnAn1bn+An1bn1An2bn2+...+Am+1bm+1Ambm+1+Ambm=Anbni=mn1Ai(bi+1bi)
也可以从几何上来理解:

我们以 m = 1 为例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们要求和的部分为对角线元素,那么对角线之和可以表示为 大梯形 - 小梯形,或者说每行的差分求和

即:
∑ i = 1 n a i b i = ∑ i = 1 n a i b n − ∑ i = 1 n − 1 a i b n + ∑ i = 1 n − 1 a i b n − 1 − ∑ i = 1 n − 2 a i b n − 2 + . . . + ∑ i = 1 2 a i b 2 − a 1 b 2 + a 1 b 1 = A n b n − ∑ i = m n − 1 A i ( b i + 1 − b i ) \begin{align} & \ \ \ \ \sum_{i=1}^{n}a_ib_i \\ &= \sum_{i=1}^{n}a_ib_n - \sum_{i=1}^{n-1}a_ib_n + \sum_{i=1}^{n-1}a_ib_{n-1} - \sum_{i=1}^{n-2}a_ib_{n-2} + ... + \sum_{i=1}^{2}a_ib_2 - a_1b_2 + a_1b_1 \\ &= A_nb_n - \sum_{i=m}^{n-1} A_i(b_{i+1} - b_i) \end{align}     i=1naibi=i=1naibni=1n1aibn+i=1n1aibn1i=1n2aibn2+...+i=12aib2a1b2+a1b1=Anbni=mn1Ai(bi+1bi)

利用 Abel 变换,可以证明很多涉及到乘积的求和的问题,因为它可以将乘积的求和表示为求和的乘积

二、一些比较浅显的应用

2.1 等差 乘 等比型求和

高中常用方法是错位相减法,有了 Abel 变换,可以更为快速的求解。

设有 ai 为公差为d等差数列,bi 为首项为1公比为 q 的等比数列,我们要求 ∑ i = 1 n a i b i \sum_{i=1}^{n}a_ib_i i=1naibi

记 bi 的前n项部分和为 Bn
∑ i = 1 n a i b i = a n B n − ∑ i = 1 n − 1 d B i = a n q ( 1 − q n ) 1 − q − ∑ i = 1 n − 1 d q ( 1 − q i ) 1 − q \begin{align} & \ \ \ \ \sum_{i=1}^{n}a_ib_i \\ &= a_nB_n - \sum_{i=1}^{n-1} d B_{i} \\ &= a_n \frac{q(1-q^n)}{1-q} - \sum_{i=1}^{n-1} d \frac{q(1-q^i)}{1-q} \end{align}     i=1naibi=anBni=1n1dBi=an1qq(1qn)i=1n1d1qq(1qi)

2.2 平方求和公式

我们熟知 ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^{n}i^2 = \frac{n(n+1)(2n+1)}{6} i=1ni2=6n(n+1)(2n+1)

可以看成 ai = bi = i,我们记 要求的式子为 S(n)

可以轻松的用 Abel 变换来推导:
S ( n ) = ∑ i = 1 n i 2 = n 2 ( n + 1 ) 2 − ∑ i = 1 n − 1 i 2 + i 2 = n 2 ( n + 1 ) 2 − n ( n − 1 ) 4 − S ( n ) − n 2 2 解得 : S ( n ) = n ( n + 1 ) ( 2 n + 1 ) 6 \begin{align} S(n) &= \sum_{i=1}^{n}i^2 \\ &= \frac{n^2(n+1)}{2} - \sum_{i=1}^{n-1}\frac{i^2+i}{2} \\ &= \frac{n^2(n+1)}{2} - \frac{n(n-1)}{4} - \frac{S(n)-n^2}{2} \\ & 解得: S(n) = \frac{n(n+1)(2n+1)}{6} \end{align} S(n)=i=1ni2=2n2(n+1)i=1n12i2+i=2n2(n+1)4n(n1)2S(n)n2解得:S(n)=6n(n+1)(2n+1)

2.3 不等式证明

来自知乎学数相伴

证明不等式 : 2 3 n n < ∑ i = 1 n i < 4 n + 3 6 n 证:我们分两步来证明,先证左侧不等式,再证右侧不等式。 首先左侧,考虑 a n = 1 , b n = n ,设 S = ∑ i = 1 n i ,我们应用 A b e l 变换,则有: S = b n A n − ∑ i = 1 n − 1 ( b i + 1 − b i ) A i = n n − ∑ i = 1 n − 1 ( i + 1 − i ) i 因为: ( n − 1 ) ( n − n − 1 ) = ( n − 1 ) 1 n + n − 1 < n − 1 2 n − 1 = n − 1 2 因此: S > n n − 1 2 ( 1 + 2 + ⋯ + n − 1 ) = n n − 1 2 ( S − n ) 即 S > 2 n + 1 3 n > 2 n 3 n ,左侧证明完成。 右侧证明,类似,考虑 a n = n , b n = 1 n ,设 S = ∑ i = 1 n i , A n = n ( n + 1 ) 2 , 同样应用 A b e l 变换: S = b n A n − ∑ i = 1 n − 1 ( b i + 1 − b i ) A i = 1 n n ( n + 1 ) 2 − ∑ i = 1 n − 1 ( 1 i + 1 − 1 i ) i ( i + 1 ) 2 ( 1 m − 1 − 1 m ) m ( m − 1 ) 2 = m − m − 1 m − 1 ⋅ m ⋅ m ( m − 1 ) 2 = m ( m − 1 ) ( m − m − 1 ) 2 = m ( m − 1 ) 2 ( m + m − 1 ) 由基本不等式 a b a + b ≤ a + b 4 得到: ( 1 m − 1 − 1 m ) m ( m − 1 ) 2 ≤ m + m − 1 8 因此: S = 1 n n ( n + 1 ) 2 − ∑ i = 1 n − 1 ( 1 i + 1 − 1 i ) i ( i + 1 ) 2 = 1 n n ( n + 1 ) 2 + ∑ i = 1 n − 1 ( 1 i − 1 i + 1 ) i ( i + 1 ) 2 S < n + 1 2 n + 1 8 ( 1 + 2 + 2 + + 3 + 3 + ⋯ + n − 1 + n − 1 + n ) = n + 1 2 n + 1 8 ( 2 S − 1 − n ) 整理得: S < ( 4 n + 3 ) n − 1 6 < ( 4 n + 3 ) 6 n 右侧不等式得证,而且得到更精细的不等式。 \begin{align} & 证明不等式: \frac{2}{3} n \sqrt{n}<\sum_{i=1}^{n} \sqrt{i}<\frac{4 n+3}{6} \sqrt{n} \\ & 证:我们分两步来证明,先证左侧不等式,再证右侧不等式。\\ & 首先左侧,考虑 a_{n}=1, b_{n}=\sqrt{n} ,设 S=\sum_{i=1}^{n} \sqrt{i} ,我们应用Abel变换,则有:\\ & S=b_{n} A_{n}-\sum_{i=1}^{n-1}\left(b_{i+1}-b_{i}\right) A_{i}=n \sqrt{n}-\sum_{i=1}^{n-1}(\sqrt{i+1}-\sqrt{i}) i \\ & 因为: (n-1)(\sqrt{n}-\sqrt{n-1})=(n-1) \frac{1}{\sqrt{n}+\sqrt{n-1}}<\frac{n-1}{2 \sqrt{n-1}}=\frac{\sqrt{n-1}}{2} \\ & 因此: S>n \sqrt{n}-\frac{1}{2}(\sqrt{1}+\sqrt{2}+\cdots+\sqrt{n-1})=n \sqrt{n}-\frac{1}{2}(S-\sqrt{n}) \\ & 即 S>\frac{2 n+1}{3} \sqrt{n}>\frac{2 n}{3} \sqrt{n} ,左侧证明完成。\\ & 右侧证明,类似,考虑 a_{n}=n, b_{n}=\frac{1}{\sqrt{n}} ,设 S=\sum_{i=1}^{n} \sqrt{i}, A_{n}=\frac{n(n+1)}{2} ,\\ & 同样应用Abel变换: S=b_{n} A_{n}-\sum_{i=1}^{n-1}\left(b_{i+1}-b_{i}\right) A_{i}=\frac{1}{\sqrt{n}} \frac{n(n+1)}{2}-\sum_{i=1}^{n-1}\left(\frac{1}{\sqrt{i+1}}-\frac{1}{\sqrt{i}}\right) \frac{i(i+1)}{2} \\ & \left(\frac{1}{\sqrt{m-1}}-\frac{1}{\sqrt{m}}\right) \frac{m(m-1)}{2}=\frac{\sqrt{m}-\sqrt{m-1}}{\sqrt{m-1} \cdot \sqrt{m}} \cdot \frac{m(m-1)}{2}\\ & \begin{array}{l} =\frac{\sqrt{m(m-1)}(\sqrt{m}-\sqrt{m-1})}{2} \\ =\frac{\sqrt{m(m-1)}}{2(\sqrt{m}+\sqrt{m-1})} \end{array} \\ & 由基本不等式 \frac{a b}{a+b} \leq \frac{a+b}{4} \\ & 得到: \left(\frac{1}{\sqrt{m-1}}-\frac{1}{\sqrt{m}}\right) \frac{m(m-1)}{2} \leq \frac{\sqrt{m}+\sqrt{m-1}}{8} \\ & 因此:\\ S & =\frac{1}{\sqrt{n}} \frac{n(n+1)}{2}-\sum_{i=1}^{n-1}\left(\frac{1}{\sqrt{i+1}}-\frac{1}{\sqrt{i}}\right) \frac{i(i+1)}{2}=\frac{1}{\sqrt{n}} \frac{n(n+1)}{2}+\sum_{i=1}^{n-1}\left(\frac{1}{\sqrt{i}}-\frac{1}{\sqrt{i+1}}\right) \frac{i(i+1)}{2} \\ S & <\frac{n+1}{2} \sqrt{n}+\frac{1}{8}(\sqrt{1}+\sqrt{2}+\sqrt{2}++\sqrt{3}+\sqrt{3}+\cdots+\sqrt{n-1}+\sqrt{n-1}+\sqrt{n}) \\ & =\frac{n+1}{2} \sqrt{n}+\frac{1}{8}(2 S-1-\sqrt{n}) \\ & 整理得: S<\frac{(4 n+3) \sqrt{n}-1}{6}<\frac{(4 n+3)}{6} \sqrt{n} \\ & 右侧不等式得证,而且得到更精细的不等式。 \end{align} SS证明不等式:32nn <i=1ni <64n+3n 证:我们分两步来证明,先证左侧不等式,再证右侧不等式。首先左侧,考虑an=1,bn=n ,设S=i=1ni ,我们应用Abel变换,则有:S=bnAni=1n1(bi+1bi)Ai=nn i=1n1(i+1 i )i因为:(n1)(n n1 )=(n1)n +n1 1<2n1 n1=2n1 因此:S>nn 21(1 +2 ++n1 )=nn 21(Sn )S>32n+1n >32nn ,左侧证明完成。右侧证明,类似,考虑an=n,bn=n 1,设S=i=1ni ,An=2n(n+1)同样应用Abel变换:S=bnAni=1n1(bi+1bi)Ai=n 12n(n+1)i=1n1(i+1 1i 1)2i(i+1)(m1 1m 1)2m(m1)=m1 m m m1 2m(m1)=2m(m1) (m m1 )=2(m +m1 )m(m1) 由基本不等式a+bab4a+b得到:(m1 1m 1)2m(m1)8m +m1 因此:=n 12n(n+1)i=1n1(i+1 1i 1)2i(i+1)=n 12n(n+1)+i=1n1(i 1i+1 1)2i(i+1)<2n+1n +81(1 +2 +2 ++3 +3 ++n1 +n1 +n )=2n+1n +81(2S1n )整理得:S<6(4n+3)n 1<6(4n+3)n 右侧不等式得证,而且得到更精细的不等式。

三、一些算法题的式子优化

3.1 3500.将数组分割为子数组的最小代价

原题链接

3500. 将数组分割为子数组的最小代价

思路分析

对于 第 i 个子数组nums[l…r]的和我们记为 t(i),cost[l…r] 的和我们记为 B(i)

那么 第 i 个子数组的收益为:t(i) * B(i) + k * i * B(i)

如果只有前半部分或者 后半部分没有i,那么我们可以轻松的写出 O(N^2) 的 划分型dp

但是现在有 i,考虑对后半部分Abel 变换:
∑ i = 1 k i B ( i ) = k S ( i ) − ∑ i = 1 k − 1 S ( i ) = S ( i ) + S ( i ) − S ( 1 ) + S ( i ) − S ( 2 ) + . . . + S ( i ) − S ( i − 1 ) 其中, S ( i ) 为前 i 个 c o s t 子数组的和 \begin{align} & \sum_{i=1}^{k} iB(i) \\ &= kS(i) - \sum_{i=1}^{k-1} S(i) \\ &= S(i) + S(i) - S(1) + S(i) - S(2) + ... + S(i) - S(i-1) \\ & 其中,S(i) 为 前i个cost子数组的和 \end{align} i=1kiB(i)=kS(i)i=1k1S(i)=S(i)+S(i)S(1)+S(i)S(2)+...+S(i)S(i1)其中,S(i)为前icost子数组的和
我们发现 k 个子数组的 后半部分贡献就是 k 个cost[] 的后缀和

如果我们记 f(i + 1) 为下标[0,i] 分割后的最小总代价,则有如下转移:
f [ i + 1 ] = min ⁡ j = 0 i f [ j ] + ( t [ i ] − t [ j ] ) × ( s [ i ] − s [ j ] ) + k × ( s [ n ] − s [ i ] ) \begin{align} f[i + 1] = \min_{j=0}^{i} f[j] + (t[i] - t[j]) \times (s[i] - s[j]) + k \times (s[n] - s[i]) \end{align} f[i+1]=j=0minif[j]+(t[i]t[j])×(s[i]s[j])+k×(s[n]s[i])
时间复杂度:O(N^2)

可用凸包优化至 O(N)

AC代码

using i64 = long long;class Solution {
static constexpr i64 inf = 1E18;
public:i64 minimumCost(std::vector<int>& nums, std::vector<int>& cost, int k) {int n = nums.size();std::vector<int> s(n + 1);for (int i = 1; i <= n; ++ i) s[i] = cost[i - 1] + s[i - 1];std::vector<i64> f(n + 1, inf);f[0] = 0;int t = 0;for (int i = 1; i <= n; ++ i) {t += nums[i - 1];for (int j = 0; j < i; ++ j) {f[i] = std::min(f[i], f[j] + 1LL * t * (s[i] - s[j]) + k * (s[n] - s[j]));}}return f[n];}
};

3.2 D. Array Splitting

原题链接

D. Array Splitting

思路分析

我们要最大化 Σ ai f(i)

对式子进行Abel 变换:
∑ i = 1 n a i f ( i ) = A ( n ) f ( n ) − ∑ i = 1 n − 1 [ f ( i + 1 ) − f ( i ) ] A ( i ) = k A ( n ) − ∑ i = 1 n − 1 [ f ( i + 1 ) − f ( i ) ] A ( i ) \begin{align} & \sum_{i=1}^{n}a_if_(i) \\ &= A(n)f(n) - \sum_{i=1}^{n-1}[f(i+1)-f(i)]A(i)\\ &= kA(n) - \sum_{i=1}^{n-1}[f(i+1)-f(i)]A(i) \end{align} i=1naif(i)=A(n)f(n)i=1n1[f(i+1)f(i)]A(i)=kA(n)i=1n1[f(i+1)f(i)]A(i)
注意到 f(i + 1) - f(i) 可能的取值只有1 / 0,并且只会在每组的分段点处取一次1,一共会取k - 1次

为了让结果尽可能大,我们要让减去的部分尽可能的小,也就是说我们要选前k - 1 小的 A(i),即 前k - 1 小的前缀和

于是我们先把 kA(n) 累加到答案中,然后对前缀和数组去除A(n)后,减去前k - 1小A(i)

时间复杂度:O(n),C++快速划分的时间复杂度为O(N)

AC代码

#include <bits/stdc++.h>
using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, k;std::cin >> n >> k;std::vector<i64> A(n);for (int i = 0; i < n; ++ i) {std::cin >> A[i];if (i > 0) A[i] += A[i - 1];}i64 ans = A[n - 1] * k;A.pop_back();std::nth_element(A.begin(), A.begin() + k - 1, A.end());ans -= std::reduce(A.begin(), A.begin() + k - 1);std::cout << ans << '\n';return 0;
}

3.3 300. 任务安排1

原题链接

300. 任务安排1

思路分析

和 3.1 类似,我们先想一个 O(N^3) 的暴力dp:

定义 f(i, j) 为 前 i 个任务划分 j 组的最小费用,则有如下转移:

  • 记 T[i] 为 前 i 个任务的时间和
  • A[i] 为 第 i 批任务的 c[] 之和,B[i] 为 前 i 批任务的 c[] 之和
  • C[i] 为 前 i 个任务的 c[] 之和

f ( i , j ) = min ⁡ k = 1 i − 1 f ( k , j − 1 ) + A [ j ] × ( T [ i ] + j S ) = min ⁡ k = 1 i − 1 f ( k , j − 1 ) + A [ j ] T [ i ] + A [ j ] j S \begin{align} & f(i, j) = \min_{k=1}^{i-1} f(k, j-1) + A[j] \times (T[i] + jS) \\ &= \min_{k=1}^{i-1} f(k, j-1) + A[j]T[i] + A[j]jS \\ \end{align} f(i,j)=k=1mini1f(k,j1)+A[j]×(T[i]+jS)=k=1mini1f(k,j1)+A[j]T[i]+A[j]jS

我们发现如果最后一项没有j,那么就是O(N^2)的dp

考虑对最后一项进行 Abel 变换:
∑ i = 1 k A [ i ] i S = B [ k ] k S − ∑ i = 1 k − 1 S B [ i ] = B [ k ] S + B [ k ] S − B [ k − 1 ] S + . . . + B [ 2 ] S − B [ 1 ] S 拆成了 k 个后缀和 \begin{align} & \sum_{i=1}^{k}A[i]iS \\ &= B[k]kS - \sum_{i=1}^{k-1}SB[i]\\ &= B[k]S + B[k]S - B[k - 1]S + ... + B[2]S - B[1]S \\ & 拆成了 k 个后缀和 \end{align} i=1kA[i]iS=B[k]kSi=1k1SB[i]=B[k]S+B[k]SB[k1]S+...+B[2]SB[1]S拆成了k个后缀和
则我们定义 f(i + 1) 为 对下标 [0, i] 分组后的最小花费,有如下转移方程:
f [ i ] = min ⁡ j = 0 i − 1 f [ j ] + ( C [ i ] − C [ j ] ) × T [ i ] + s × ( C [ n ] − C [ j ] ) \begin{align} & f[i] = \min_{j=0}^{i - 1} f[j] + (C[i] - C[j]) \times T[i] + s \times (C[n] - C[j]) \end{align} f[i]=j=0mini1f[j]+(C[i]C[j])×T[i]+s×(C[n]C[j])

时间复杂度:O(N^2)

可凸包优化

AC代码

#include <bits/stdc++.h>
using i64 = long long;constexpr i64 inf = 1E18;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, s;std::cin >> n >> s;std::vector<int> t(n), c(n);for (int i = 0; i < n; ++ i) {std::cin >> t[i] >> c[i];}std::vector<i64> T(n + 1), C(n + 1);for (int i = 1; i <= n; ++ i) {T[i] = T[i - 1] + t[i - 1];C[i] = C[i - 1] + c[i - 1];}std::vector<i64> f(n + 1, inf);f[0] = 0;for (int i = 1; i <= n; ++ i) {for (int j = 0; j < i; ++ j) {f[i] = std::min(f[i], f[j] + (C[i] - C[j]) * T[i] + s * (C[n] - C[j]));}}std::cout << f[n] << '\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87745.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87745.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87745.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火山 RTC 引擎12----合流转推 集成

一、火山、网易 合流转推集成 1、 首次先要startPush,要不然,推不了流 void NRTCEngine::PushToCDN(std::string taskID, std::string url) {if (m_video == nullptr) return;bytertc::IMixedStreamConfig* config = getMixedStreamConfig(url);int ret = m_video->star…

基于STM32设计的物联网疫苗冷链物流监测系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状(1)国内研究现状(2)国外研究现状(3)技术演进趋势分析(4)现存技术缺口(5)关键案例技术对比表【6】摘要1.2 设计思路1.3 系统功能总结1.4 开…

音频中采样率和帧是什么?怎么理解?

视频中的“帧”是指一张图片&#xff0c;那么在音频中&#xff0c;“帧”的含义就完全不同了。理解音频中的“帧”概念&#xff0c;对做音视频处理、流媒体开发非常关键。 一、声音是怎么采集的&#xff1f; 音频采集是指通过麦克风等设备捕捉周围环境中的声波&#xff0c;并…

第三方检测护航软件登记:企业合规的技术通行证与市场信任基石

一、软件产品登记测试&#xff1a;合规化的必经之路 根据《软件产品管理办法》&#xff0c;所有上市软件必须通过第三方检测机构的专业评估&#xff0c;确保功能、性能、安全性等指标符合国家标准&#xff08;如GB/T 25000系列&#xff09;。这一强制性要求不仅规避了法律风险…

产品页不被收录的6个技术原因(非重复内容/爬虫限制类)

页面未被收录的原因可能藏在代码架构或服务器配置中 比如爬虫无法“看懂”你的动态内容&#xff0c;或是某个参数设置错误导致页面被判定为重复。 本文从技术排查角度出发&#xff0c;整理6个最易被忽视但直接影响收录的实操问题。 页面加载速度拖慢爬虫抓取 例如&#xff0…

如何在FastAPI中打造一个既安全又灵活的权限管理系统?

title: 如何在FastAPI中打造一个既安全又灵活的权限管理系统? date: 2025/06/16 08:17:05 updated: 2025/06/16 08:17:05 author: cmdragon excerpt: FastAPI权限系统通过依赖注入实现三级验证:身份认证、角色验证和权限校验。数据库模型包括用户、角色和权限注册表,支持…

通过Radius认证服务器实现飞塔/华为防火墙二次认证:原理、实践与安全价值解析

引言&#xff1a;数字化转型中的身份认证挑战 在数字化转型加速的今天&#xff0c;企业网络边界日益模糊&#xff0c;混合云架构、远程办公、物联网设备接入等场景对网络安全提出全新挑战。传统防火墙基于IP/端口的访问控制已无法满足动态安全需求&#xff0c;如何构建"持…

golang--context的使用指南与核心特性

Go 语言 context 包&#xff1a;使用指南与核心特性 一、context 的本质与设计目的 context 是 Go 语言中管理请求生命周期的核心机制&#xff0c;它提供了一套统一的方式来&#xff1a; 传递请求范围数据&#xff08;如用户认证信息&#xff09;控制跨 goroutine 的生命周期…

耗时3小时,把这两天做好的爬虫程序,用Python封装成exe文件

先执行命令如下&#xff1a; pip install pyinstaller py -m PyInstaller --log-levelDEBUG --add-data "config.ini;." nmpa_gui.py很快在dist目录下就有生成一个nmpa_gui文件夹&#xff0c;运行 nmpa_gui.exe&#xff0c;报错&#xff1a; 1️⃣初始化爬虫… 程序…

Linux下nginx访问路径页面

第一步&#xff1a;通过Xshell在虚拟机中下载nginx sudo apt-get install nginx 第二步&#xff1a;进入nginx配置页面 cd /etc/nginx 我这里创建了一个html文件夹 在进入去创建页面并且重新加载 boahuboahu-VMware-Virtual-Platform:/$ cd /etc/nginx boahuboahu-VMware-Vir…

三维视频融合怎么弄?三步实现精准投射与自由修剪

分享大纲&#xff1a; 1、场景引入&#xff1a;为什么你的三维场景视频融合效果不理想&#xff1f; 2、解决方案&#xff1a;捷码视频融合三步操作指南 3、捷码平台&#xff1a;低代码构建动态三维视界 在智慧城市中的安防领域&#xff0c;将实时视频与三维场景融合已是大势需求…

探索阿里云网络与CDN产品:解锁高效网络体验

阿里云网络产品概述 在云计算蓬勃发展的当下&#xff0c;网络作为连接计算、存储与用户的关键纽带&#xff0c;其重要性不言而喻。阿里云作为全球知名的云计算服务提供商&#xff0c;凭借其丰富且强大的网络产品体系&#xff0c;为企业数字化转型筑牢了坚实的网络根基&#xf…

深入理解C语言指针(二):从数组到多级指针的全面解析

作为C语言的核心概念&#xff0c;指针常常让初学者感到困惑。本文将从数组与指针的关系入手&#xff0c;逐步揭开指针在数组操作、函数传参以及多级指针中的神秘面纱&#xff0c;帮助你建立系统的指针知识体系。 一、数组名的双重身份&#xff1a;首地址与整体标识 在C语言中&a…

Windows PPT/word怎么pdf不降低分辨率,插入可编辑

Windows PPT/word怎么pdf不降低分辨率 下载软件Inkscape&#xff1a;Inkscape - Draw Freely. | Inkscape 然后使用Inkscape将你的PDF转为svg, 然后用office的PPT打开&#xff0c;将svg复制进PPT/word&#xff0c;然后保存就可以了 插入可编辑的&#xff08;只能通过Mac的才可…

vue3 select 选中值时,即获得id,也获得name值并且输入框正确选中

1.获取 name和id 直接绑定对象 将 value 绑定为整个对象&#xff0c;通过 change 事件获取完整数据 value-key 绑定唯一标识 value 绑定为整个对象&#xff0c;通过 change 事件获取完整数据 <el-select v-model"selectedItem" change"handleChange"…

什么是Seata

Seata的实现原理主要围绕其核心架构&#xff08;TC/TM/RM&#xff09;和事务模式&#xff08;如AT、TCC等&#xff09;展开&#xff0c;通过协调全局事务与分支事务的协作保证数据一致性。以下是核心实现原理的详细解析&#xff1a; ⚙️ ​​一、核心架构协作机制​​ Seata通…

linux ARM64架构用户空间和内核空间的区分

一、ARM64 架构地址空间的「黄金分割」 ARM64&#xff08;ARMv8-A&#xff09;采用 48 位虚拟地址&#xff08;Linux 默认配置&#xff09;&#xff0c;总空间为 256TB&#xff0c;分为高低两个 128TB 区域&#xff1a; 1. 地址空间整体布局 虚拟地址空间&#xff08;48位&a…

51单片机重要知识点1

1. 在读IO口状态前必须先写该IO口1. 即让下拉MOS高阻断路。如&#xff1a; P221; KEYP22; 复位状态各IO口1的。另外大多数情况都不会IO口即做输入又做输出的。设计思想永远不要复杂化高难度编程&#xff0c;而要简单明了。 2.

【解析法与几何法在阻尼比设计】自控

解析法与几何法在阻尼比设计中的详细对比 一、解析法&#xff1a;基于数学方程的定量求解 核心思想&#xff1a;通过特征方程与根轨迹条件建立代数关系&#xff0c;直接求解满足阻尼比要求的系统参数。 1. 适用场景 二阶系统或可简化为二阶系统的高阶系统&#xff08;主导极…

搭建pikachu靶场

文章目录 一、pikachu是什么?二、搭建环境1.下载链接三、安装教程phpstudy安装配置pikachu 靶场安装配置总结一、pikachu是什么? Pikachu 靶场是一个专门为网络安全爱好者和学习者设计的 Web 安全靶场。它旨在帮助用户学习和实践常见的 Web安全漏洞和攻击手法。Pikachu 靶场通…