CCF-CSP认证考试 202212-4 聚集方差 100分题解

更多 CSP 认证考试题目题解可以前往:CSP-CCF 认证考试真题题解


原题链接: 202212-4 聚集方差

时间限制: 2.0s
内存限制: 512.0MB

问题背景

通常而言,对一组数据 A = a 1 , . . . , a n A={a_1,...,a_n} A=a1,...,an,可以使用方差 σ 2 ( A ) = 1 n ∑ i = 1 n ( a i − μ ( A ) ) 2 \sigma^2(A)=\frac 1n\sum_{i=1}^n (a_i-\mu(A))^2 σ2(A)=n1i=1n(aiμ(A))2 来衡量其离散程度(其中 μ ( A ) = 1 n ∑ i = 1 n a i \mu(A)=\frac{1}{n}\sum_{i=1}^na_i μ(A)=n1i=1nai 为平均值),或者说“整体聚集”的程度。然而,现实生活中的数据有时是“分组聚集”的——它们可以被分为若干组,每一组都是相对“聚集”的,但不同组间差距较大,因此整体相对离散。此时,方差无法反映这种分组聚集的性质,而人为指定分组的情况则使计算复杂。为此,可以提出一种简单的衡量方式:称一组数据 A = a 1 , a 2 , . . . , a n A={a_1,a_2,...,a_n} A=a1,a2,...,an 的“聚集方差”为:
G ( A ) = 1 n ∑ i = 1 n min ⁡ j = 1 , j ≠ i n ( a i − a j ) 2 \mathcal G(A)=\frac 1n\sum_{i=1}^n \min_{j=1,j\neq i}^n (a_i-a_j)^2 G(A)=n1i=1nj=1,j=iminn(aiaj)2
特别的,当 n = ∣ A ∣ = 1 n=|A|=1 n=A=1 时,规定 G ( A ) = 0 \mathcal G(A)=0 G(A)=0

例如,对 A = 0 , 0 , 0 , 4 , 4 , 4 , 7 , 8 , 9 A={0,0,0,4,4,4,7,8,9} A=0,0,0,4,4,4,7,8,9,则方差 σ 2 ( A ) = 98 9 ≃ 10.89 \sigma^2(A)=\frac{98}{9}\simeq10.89 σ2(A)=99810.89,但 G ( A ) = 1 3 ≃ 0.33 \mathcal G(A)=\frac{1}{3}\simeq 0.33 G(A)=310.33,说明若 A A A 0 , 0 , 0 , 4 , 4 , 4 , 7 , 8 , 9 {0,0,0},{4,4,4},{7,8,9} 0,0,0,4,4,4,7,8,9 的方式分组,则相对与整体而言,每一组内都相对聚集。

问题描述

考虑这样一个模型:现实中一个公司的结构可以用一棵有根树来描述,其中每个点对应一位员工,其父节点(如果有的话)代表了他的直属上司,而其自子树中的点(包括这个点本身)则代表所有可被他支配的员工(广义的讲,人可以支配自己,因此人可以视为自己的员工,因此此处“员工”的概念包括他自己本人)。

一般地,假定该公司内有 n n n 位员工,编号从 1 1 1 n n n;对编号为 x x x 的员工,记 T ( x ) T(x) T(x) 为其子树内所有点的编号的集合(包括 x x x 本身)。

x > 1 x>1 x>1,记 p x p_x px 为其父节点的编号,并假定总有 1 ≤ p x < x 1\le p_x<x 1px<x(从而编号为 1 1 1 的员工是该公司唯一的老板)。

我们说明“聚集方差”可以作为一种统计方式帮助该公司的老板了解他的公司,例如,假定每个员工每年都有一小时的可以自主选择时间的带薪年假,那么可以根据历史数据,统计出每位员工偏好的时间;对第 x ∈ [ 1 , n ] x\in[1,n] x[1,n] 位员工,可以用一个非负整数 a x a_x ax 表示其偏好的时间。

A ( x ) = a y : y ∈ T ( x ) A(x)={a_y:y\in T(x)} A(x)=ay:yT(x) 为编号为 x x x 的点的子树内所有点(包括 x x x)对应员工的偏好时间的可重集合(从而 ∣ A ( x ) ∣ = ∣ T ( x ) ∣ |A(x)|=|T(x)| A(x)=T(x))。那么,对于一位编号为 x x x 的员工,若其可支配的员工偏好的时间的聚集方差 G ( A ( x ) ) = 1 ∣ T ( x ) ∣ ∑ y ∈ T ( x ) min ⁡ z ∈ T ( x ) , z ≠ y ( a z − a y ) 2 \mathcal G(A(x))=\frac{1}{|T(x)|}\sum_{y\in T(x)}\min_{z\in T(x),z\neq y}(a_z-a_y)^2 G(A(x))=T(x)1yT(x)minzT(x),z=y(azay)2 较小,那么说明他可能需要担心会因在某个时间有较多的员工请假而导致工作任务受到影响,从而应该调整工作日程以避免这一问题;反之则说明他不太需要过多关注这一点。

因此该公司的老板想了解,对每个 x ∈ [ 1 , n ] x\in[1,n] x[1,n] G ( A ( x ) ) \mathcal G(A(x)) G(A(x)) 是多少?当然,为了避免精度误差,你只需要输出 Ans x = ∣ T ( x ) ∣ G ( A ( x ) ) \text{Ans}_x=|T(x)|\mathcal G(A(x)) Ansx=T(x)G(A(x))。容易验证 Ans x \text{Ans}_x Ansx 总是整数。

输入格式

从标准输入读入数据。

第一行一个正整数 n n n 表示树的大小;

接下来一行 n − 1 n-1 n1 个正数依次表示 p 2 , . . . , p n p_2,...,p_n p2,...,pn

接下来一行 n n n 个非负数依次表示 a 1 , . . . , a n a_1,...,a_n a1,...,an

输出格式

输出到标准输出中。

n n n 行,其中第 i i i 行为一个非负整数表示 Ans i \text{Ans}_i Ansi

样例输入

2
1
0 1

样例输出

2
0

评测用例规模与约定

子任务编号 n ≤ n\le n特殊性质子任务分值
1 1 1 300 300 300/ 15 15 15
2 2 2 3000 3000 3000/ 25 25 25
3 3 3 300000 300000 300000A 15 15 15
4 4 4 300000 300000 300000B 15 15 15
5 5 5 300000 300000 300000C 10 10 10
6 6 6 300000 300000 300000/ 20 20 20

特殊性质 A: ∀ i ∈ ( 1 , n ] , p i = i − 1 \forall i\in(1,n],p_i=i-1 i(1,n],pi=i1

特殊性质 B: ∀ i ∈ ( 1 , n ] , p i = ⌊ i 2 ⌋ \forall i\in(1,n],p_i=\left\lfloor\frac i2\right\rfloor i(1,n],pi=2i

特殊性质 C: ∀ i , j ∈ [ 1 , n ] , i ≠ j ⇒ a i ≠ a j \forall i,j\in[1,n],i\neq j\Rightarrow a_i\neq a_j i,j[1,n],i=jai=aj

对于 100 % 100\% 100% 的数据, 2 ≤ n ≤ 3 × 1 0 5 ; ∀ i ∈ ( 1 , n ] , p i ∈ [ 1 , i ) ; ∀ i ∈ [ 1 , n ] , a i ∈ [ 0 , 1 0 9 ] 2\le n\le 3\times 10^5;\forall i\in(1,n],p_i\in[1,i);\forall i\in[1,n],a_i\in[0,10^9] 2n3×105;i(1,n],pi[1,i);i[1,n],ai[0,109]


题解

启发式合并。

对于每个子树 u u u,用 std::map<int, pair<int, int>> 表示在这棵子树中,偏好时间为 a i a_i ai 的人所对应的最小的 min ⁡ j ∈ T ( u ) , j ≠ i ( a j − a i ) 2 \min_{j\in T(u),j\neq i}(a_j-a_i)^2 minjT(u),j=i(ajai)2 a j a_j aj 的值,以及偏好时间为 a i a_i ai 的人的数量(下文会简写为 c n t cnt cnt)。

c n t > 1 cnt>1 cnt>1 时,易知 a j = a i a_j=a_i aj=ai,此时 min ⁡ j ∈ T ( u ) , j ≠ i ( a j − a i ) 2 = 0 \min_{j\in T(u),j\neq i}(a_j-a_i)^2=0 minjT(u),j=i(ajai)2=0

考虑启发式合并的过程:这里我是先将当前子树的根的 map 作为引用参数通过 dfs 求出重儿子的信息,然后将当前子树的根插入,最后求出所有的轻儿子的信息并向根的 map 中逐元组合并。

对于每一次向 map 中插入元组 ( a i , a j , c n t ) (a_i,a_j,cnt) (ai,aj,cnt),可以看成在数轴上插入一个点 a i a_i ai,然后去更新距离每个点最近的点,可以发现受影响的只有小于 a i a_i ai 的最大的元组 ( p r e . a i , p r e . a j , p r e . c n t ) (pre.a_i,pre.a_j,pre.cnt) (pre.ai,pre.aj,pre.cnt)、大于 a i a_i ai 的最小元组 ( s u f . a i , s u f . a j , s u f . c n t ) (suf.a_i,suf.a_j,suf.cnt) (suf.ai,suf.aj,suf.cnt) 和当前元组。

对于每次插入操作,考虑两种情况:

  • 原先有相同键值的元组 ( a i , A j , C N T ) (a_i,A_j,CNT) (ai,Aj,CNT),此时插入后必定使 a i a_i ai 键值的 c n t > 1 cnt>1 cnt>1 A j A_j Aj 应该等于 a i a_i ai,那么就可以让 a n s − = A j 2 ∗ c n t ans-=A_j^2*cnt ans=Aj2cnt 来消去原先对答案的影响,并将 A j A_j Aj 设为 0 0 0 C N T CNT CNT 加上 c n t cnt cnt。这样如果在合并一个键值为 a i a_i ai 的元组只会减 0 0 0,不会产生影响。
  • 原先没有相同键值的元组,此时 p r e , s u f pre,suf pre,suf 的值都有可能会更新:
    1. 先将原先的值从答案中减去,即 a n s − = ( p r e . a j ) 2 × p r e . c n t + ( s u f . a j ) 2 × s u f . c n t ans-=(pre.a_j)^2\times pre.cnt+(suf.a_j)^2\times suf.cnt ans=(pre.aj)2×pre.cnt+(suf.aj)2×suf.cnt
    2. 更新 p r e , s u f pre,suf pre,suf 元组,即 p r e . a j = min ⁡ { p r e . a j , a i − p r e . a i } pre.a_j=\min\{pre.a_j,a_i-pre.a_i\} pre.aj=min{pre.aj,aipre.ai} s u f . a j = min ⁡ { s u f . a j , s u f . a i − a i } suf.a_j=\min\{suf.a_j,suf.a_i-a_i\} suf.aj=min{suf.aj,suf.aiai}
    3. p r e , s u f pre,suf pre,suf 对答案的影响加回去,即 a n s + = ( p r e . a j ) 2 × p r e . c n t + ( s u f . a j ) 2 × s u f . c n t ans+=(pre.a_j)^2\times pre.cnt+(suf.a_j)^2\times suf.cnt ans+=(pre.aj)2×pre.cnt+(suf.aj)2×suf.cnt
    4. 插入元组的值 ( a i , min ⁡ { a i − p r e . a i , s u f . a i − a i } , c n t ) (a_i,\min\{a_i-pre.a_i,suf.a_i-a_i\},cnt) (ai,min{aipre.ai,suf.aiai},cnt),并计算该值对答案的影响,即 a n s + = ( min ⁡ { a i − p r e . a i , s u f . a i − a i } ) 2 × c n t ans+=(\min\{a_i-pre.a_i,suf.a_i-a_i\})^2\times cnt ans+=(min{aipre.ai,suf.aiai})2×cnt

为了方便写,将叶子结点的 a j a_j aj 设为 + ∞ +\infty +,对应的答案设为 ( + ∞ ) 2 (+\infty)^2 (+)2,在输出时特判即可,否则取 min ⁡ \min min 的时候要单独考虑叶子结点。

时间复杂度: O ( n log ⁡ 2 n ) \mathcal{O}(n\log^2n) O(nlog2n)

参考代码(953ms,99.19MB)

/*Created by Pujx on 2024/3/28.
*/
#pragma GCC optimize(2, 3, "Ofast", "inline")
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
//#define double long double
using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
#define inf (int)0x3f3f3f3f3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define yn(x) cout << (x ? "yes" : "no") << endl
#define Yn(x) cout << (x ? "Yes" : "No") << endl
#define YN(x) cout << (x ? "YES" : "NO") << endl
#define mem(x, i) memset(x, i, sizeof(x))
#define cinarr(a, n) for (int i = 1; i <= n; i++) cin >> a[i]
#define cinstl(a) for (auto& x : a) cin >> x;
#define coutarr(a, n) for (int i = 1; i <= n; i++) cout << a[i] << " \n"[i == n]
#define coutstl(a) for (const auto& x : a) cout << x << ' '; cout << endl
#define all(x) (x).begin(), (x).end()
#define md(x) (((x) % mod + mod) % mod)
#define ls (s << 1)
#define rs (s << 1 | 1)
#define ft first
#define se second
#define pii pair<int, int>
#ifdef DEBUG#include "debug.h"
#else#define dbg(...) void(0)
#endifconst int N = 3e5 + 5;
//const int M = 1e5 + 5;
const int mod = 998244353;
//const int mod = 1e9 + 7;
//template <typename T> T ksm(T a, i64 b) { T ans = 1; for (; b; a = 1ll * a * a, b >>= 1) if (b & 1) ans = 1ll * ans * a; return ans; }
//template <typename T> T ksm(T a, i64 b, T m = mod) { T ans = 1; for (; b; a = 1ll * a * a % m, b >>= 1) if (b & 1) ans = 1ll * ans * a % m; return ans; }int a[N];
int n, m, t, k, q;
int fa[N], son[N], sz[N];
vector<int> g[N];void dfs(int u) {sz[u] = 1;for (auto v : g[u]) {dfs(v);sz[u] += sz[v];if (!son[u] || sz[v] > sz[son[u]]) son[u] = v;}
}i64 ans[N];
void add(int u, int val, int cnt, map<int, pii>& mp) {if (mp.count(val)) {auto& cur = mp[val];ans[u] -= 1ll * cur.ft * cur.ft * cur.se;cur.ft = 0, cur.se += cnt;}else {mp[val] = {inf * (cnt == 1), cnt};auto& cur = mp[val];auto it = mp.lower_bound(val);if (it != mp.begin()) {--it;auto& pre = it->se;cur.ft = min(cur.ft, val - it->ft);if (pre.se) {ans[u] -= 1ll * pre.ft * pre.ft * pre.se;pre.ft = min(pre.ft, val - it->ft);ans[u] += 1ll * pre.ft * pre.ft * pre.se;}}it = mp.upper_bound(val);if (it != mp.end()) {auto& suf = it->se;cur.ft = min(cur.ft, it->ft - val);if (cur.se) {ans[u] -= 1ll * suf.ft * suf.ft * suf.se;suf.ft = min(suf.ft, it->ft - val);ans[u] += 1ll * suf.ft * suf.ft * suf.se;}}ans[u] += 1ll * cur.ft * cur.ft * cur.se;}
}
void Dfs(int u, map<int, pii>& mp) { // mp[a_i] = min_i, cntif (g[u].empty()) {mp[a[u]] = {inf, 1};ans[u] = 1ll * inf * inf;return;}Dfs(son[u], mp);ans[u] = ans[son[u]];add(u, a[u], 1, mp);for (auto v : g[u]) {if (v == son[u]) continue;map<int, pii> tem;Dfs(v, tem);for (auto it : tem)add(u, it.ft, it.se.se, mp);}
}void work() {cin >> n;for (int i = 2; i <= n; i++) {cin >> fa[i];g[fa[i]].emplace_back(i);}cinarr(a, n);dfs(1);map<int, pii> tem;Dfs(1, tem);for (int i = 1; i <= n; i++) cout << (ans[i] != 1ll * inf * inf ? ans[i] : 0) << endl;
}signed main() {
#ifdef LOCALfreopen("C:\\Users\\admin\\CLionProjects\\Practice\\data.in", "r", stdin);freopen("C:\\Users\\admin\\CLionProjects\\Practice\\data.out", "w", stdout);
#endifios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int Case = 1;//cin >> Case;while (Case--) work();return 0;
}
/*_____   _   _       _  __    __|  _  \ | | | |     | | \ \  / /| |_| | | | | |     | |  \ \/ /|  ___/ | | | |  _  | |   }  {| |     | |_| | | |_| |  / /\ \|_|     \_____/ \_____/ /_/  \_\
*/

关于代码的亿点点说明:

  1. 代码的主体部分位于 void work() 函数中,另外会有部分变量申明、结构体定义、函数定义在上方。
  2. #pragma ... 是用来开启 O2、O3 等优化加快代码速度。
  3. 中间一大堆 #define ... 是我习惯上的一些宏定义,用来加快代码编写的速度。
  4. "debug.h" 头文件是我用于调试输出的代码,没有这个头文件也可以正常运行(前提是没定义 DEBUG 宏),在程序中如果看到 dbg(...) 是我中途调试的输出的语句,可能没删干净,但是没有提交上去没有任何影响。
  5. ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 这三句话是用于解除流同步,加快输入 cin 输出 cout 速度(这个输入输出流的速度很慢)。在小数据量无所谓,但是在比较大的读入时建议加这句话,避免读入输出超时。如果记不下来可以换用 scanfprintf,但使用了这句话后,cinscanfcoutprintf 不能混用。
  6. main 函数和 work 函数分开写纯属个人习惯,主要是为了多组数据。

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

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

相关文章

【物联网】Qinghub opc-ua 连接协议

基础信息 组件名称 &#xff1a; opcua-connector 组件版本&#xff1a; 1.0.0 组件类型&#xff1a; 系统默认 状 态&#xff1a; 正式发布 组件描述&#xff1a;通过OPCUA连接网关&#xff0c;通过定时任务获取OPCUA相关的数据或通过执行指令控制设备相关参数。 配置文件&a…

卸载原有的cuda,更新cuda

概述&#xff1a;看了一下自己的gpu&#xff0c;发现驱动可能装低了&#xff0c;随即尝试更新驱动&#xff0c;写下此篇 注&#xff1a;我原先是10.2的版本&#xff0c;改了之后是11.2&#xff0c;下面的图都用11.2的&#xff0c;不过不碍事 目录 第一步&#xff1a;查看现在…

计算机网络目录

北航计算机网络 chapter1 北航计算机网络 chapter2 物理层 北航计算机网络 chapter3 数据链路层 北航计算机网络 chapter4 网络层 北航计算机网络chapter5 传输层 北航计算机网络chapter6 应用层 北航计算机网络 chapter7 IPv6 北航计算机网络 chapter 8 VLAN

sqli第五关报错注入

源码&#xff08;单引号闭合但是没有回显&#xff09; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1"; $resultmysql_query($sql); $row mysql_fetch_array($result);if($row){echo <font size"5" color"#FFFF00">; echo You are in…

位运算算法(2)

目录 面试题 01.01. 判断字符是否唯一 一、题目描述 二、思路解析 三、代码 268.丢失的数字 一、题目描述 二、思路解析 三、代码 371.两整数之和 一、题目描述 二、思路解析 三、代码 137.只出现一次的数字 II 一、题目描述 二、思路解析 三、代码 面试题 01.0…

力扣刷题题解注意(13

力扣560和为k的子数组 其实这道题固定一边的边界&#xff0c;枚举左右边界就可&#xff0c;时间复杂度为On2。 但是由于我在代码中的画蛇添足&#xff0c;对于每一个元素的判断&#xff0c;导致了最终的结果无法通过[0,0] k0&#xff0c;ans3&#xff0c;其实这个用例也。 i…

Web漏洞-深入WAF注入绕过

目录 简要其他测试绕过 方式一:白名单&#xff08;实战中意义不大&#xff09; 方式二:静态资源 方式三: url白名单 方式四:爬虫白名单 #阿里云盾防SQL注入简要分析 #安全狗云盾SQL注入插件脚本编写 在攻防实战中&#xff0c;往往需要掌握一些特性&#xff0c;比如服务…

下拉选中搜索angularjs-dropdown-multiselect.js

需要引入angularjs-dropdown-multiselect.js 页面 <div ng-dropdown-multiselect"" options"supplierList_data" selected-model"supplierList_select" events"changSelValue_supplierList" extra-settings"mucommonsetti…

四、Yocto创建静态IP和VLAN(基于raspiberrypi 4B)

Yocto创建VLAN配置 在车载域控中很多时候需要创建VLAN&#xff0c;本小节记录如何为yocto构建出来的image自动化创建静态IP以及VLAN。 关于各种VLAN的配置参考&#xff1a;VLAN 1. ubuntu系统中使用netplan创建VLAN 正常情况下我们在ubuntu系统中可以通过netplan来自动化创建…

【Web自动化】Selenium的使用(一)

目录 关于自动化测试selenium工作机制 selenium的使用selenium中常用API定位元素按id定位按名称定位按类名定位按标签名定位按CSS选择器定位按XPath定位示例 操作测试对象等待sleep休眠隐式等待显示等待 打印信息浏览器操作键盘事件鼠标事件切换窗口截图关闭浏览器 欢迎阅读本文…

YOLO格式数据集转COCO格式

网上找了很久的YOLO格式数据集转COCO格式的代码&#xff0c;但是没有一个成功的&#xff0c;费尽千辛万苦终于找到一个能用的&#xff0c;因此记录一下。 一、首先YOLO格式数据集文件布局 其中lmages和labels 中的内容布局如下&#xff0c;只不过一个存放图片&#xff0c;一个存…

接口自动化框架搭建(三):pytest库安装

1&#xff0c;使用命令行安装 前提条件&#xff1a;已安装python环境 pip install pytest 或者 pip3 install pytest2&#xff0c;从编译器pycharme中安装

数组指针的运用

这段代码使用了数组指针&#xff0c;实现了从二维数组中获取指定位置的元素值。以下是代码的总结&#xff1a; tipsInputHangLie 函数用于提示用户输入要获取的元素的行号和列号&#xff0c;然后通过指针参数返回用户输入的行号和列号。 getDataFromArray 函数接收一个二维数组…

[TS面试]TypeScript 中 any, nerver, unknown, null undefined 和 void 有什么区别?

TypeScript 中 any, nerver, unknown, null & undefined 和 void 有什么区别? any: 动态类型变量 失去了类型检查作用 never: 永远不存在值的类型 抛出异常, 根本没有返回值的函数表达式 或者箭头函数表达式返回值类型 unknown 任何类型的值都可以赋值给unknown unknown…

6.2物联网RK3399项目开发实录-驱动开发之GPIO使用(wulianjishu666)

物联网嵌入式开发源码例程&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1B3oqq5QBhN-VmTFt9CI-7A?pwd2ihg ******************************************************************************************* GPIO 使用 简介 GPIO, 全称 General-Purpose Input/…

机器学习概念、步骤、分类和实践

在当今数字化时代&#xff0c;机器学习已经渗透到我们生活的方方面面&#xff0c;从智能手机应用、搜索引擎优化&#xff0c;到自动驾驶汽车、医疗诊断等&#xff0c;其应用无处不在。本文将带您走进机器学习的世界&#xff0c;了解它的基本概念、步骤、分类以及实践应用。 一…

前端-css-2

1.背景样式 属性名作用属性值background-color背景颜色颜色background-image设置背景图像地址url(地址)background-repeat设置背景图像重复方式 repeat&#xff1a;重复。 repeat-x&#xff1a;横向重复。 repeat-y&#xff1a;纵向重复。 no-repeat&#xff1a;不重复。 back…

SpringBoot集成JWT基础使用

目录 一.接口统一前缀设置二.JWT POM依赖三.JWT工具类TokenUtils.java四.拦截器JwtInterceptor.java五.拦截器设置六.设置自定义头配置 一.接口统一前缀设置 1.指定controller统一的接口前缀 2.加自定义拦截器JwtInterceptor&#xff0c;设置拦截规则,指定Login接口放行,不需验…

2024-3-28

今日流水账&#xff1a; 把计网实验报告完成了&#xff0c;当然还有点小问题就是PC2>PC4的测试截图没有看了下V8中是如何实现快速 for in的&#xff0c;嗯&#xff0c;懵懵懂懂吧&#xff0c;就了解了个 enum cache&#xff0c;其是描述符数组的一个字段&#xff0c;所以其…