2.21学习总结

1.【模板】ST 表
2.Balanced Lineup G
3.景区导游

4.最近公共祖先(LCA)

倍增思想:主要用于LCA问题,RMQ问题。在进行 递推 时,如果 状态空间很大,通常的 线性递推 无法满足 时间 与 空间复杂度 的要求,那么我们可以通过 成倍增长 的方式,只递推 状态空间 中在 2 的整数次幂位置上的值 作为代表。

ST 表https://www.luogu.com.cn/problem/P3865

题目描述

给定一个长度为 �N 的数列,和 �M 次询问,求出每一次询问的区间内数字的最大值。

输入格式

第一行包含两个整数 �,�N,M,分别表示数列的长度和询问的个数。

第二行包含 �N 个整数(记为 ��ai​),依次表示数列的第 �i 项。

接下来 �M 行,每行包含两个整数 ��,��li​,ri​,表示查询的区间为 [��,��][li​,ri​]。

输出格式

输出包含 �M 行,每行一个整数,依次表示每一次询问的结果。

输入输出样例

输入 #1复制

8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

输出 #1复制

9
9
7
7
9
8
7
9

说明/提示

对于 30%30% 的数据,满足 1≤�,�≤101≤N,M≤10。

对于 70%70% 的数据,满足 1≤�,�≤1051≤N,M≤105。

对于 100%100% 的数据,满足 1≤�≤1051≤N≤105,1≤�≤2×1061≤M≤2×106,��∈[0,109]ai​∈[0,109],1≤��≤��≤�1≤li​≤ri​≤N。

思路:主要只有预处理和查询两个重要的阶段,这是基于动态规划的思想,我们先建立一个二维的数组,命名为st,即st[i][j],这里的定义为以索引i为左端点,距离为2^j次的最大(最小)值为st[i][j]

以下是一个例子:

所以构建的st表如下:

首先初始化st表:这里的定义为在以i为端点距离为1的区间内的最值就是它本身。

for (int i=1;i<=n;++i)	st[i][0]=read();

预处理:O(nlogn)   这里的18是给定数组大小的对数

for (int j=1;j<=18;++j){for (int i=1;i+(1<<(j-1))-1<=n;++i){st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}}

这里的预处理,不是一行一行下去的,是一列一列

这个转移方程的思路是:将长度为2^j的数组分成两份,每分的长度是2^(j-1),比较两个区间的最大值,所以就得出了这个大区间的最大值

st[i+(1<<(j-1))][j-1]

这里就是改变了端点,使得找的范围是第二个区间。

查询功能:

给定一个查询区间[l,r],找到一个长度x,x<(r-l+1),然后继续上述的思想,比较划分的两个区间的大小,如下图所示

for (int i=1;i<=m;++i){int l=read(),r=read();int x=__lg(r-l+1);printf("%d\n", max(st[l][x], st[r - (1 << x) + 1][x]));} 

所以就可以得到完整的AC代码

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} const int N=1e5+5;int n,m,st[N][18];signed main(){n=read(),m=read();for (int i=1;i<=n;++i)	st[i][0]=read();//预处理for (int j=1;j<=18;++j){for (int i=1;i+(1<<(j-1))-1<=n;++i){st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);}}//查询for (int i=1;i<=m;++i){int l=read(),r=read();int x=__lg(r-l+1);printf("%d\n", max(st[l][x], st[r - (1 << x) + 1][x]));} 
}

Balanced Lineup Ghttps://www.luogu.com.cn/problem/P2880

题目描述

For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.

Farmer John has made a list of Q (1 ≤ Q ≤ 180,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.

每天,农夫 John 的 �(1≤�≤5×104)n(1≤n≤5×104) 头牛总是按同一序列排队。

有一天, John 决定让一些牛们玩一场飞盘比赛。他准备找一群在队列中位置连续的牛来进行比赛。但是为了避免水平悬殊,牛的身高不应该相差太大。John 准备了 �(1≤�≤1.8×105)q(1≤q≤1.8×105) 个可能的牛的选择和所有牛的身高 ℎ�(1≤ℎ�≤106,1≤�≤�)hi​(1≤hi​≤106,1≤i≤n)。他想知道每一组里面最高和最低的牛的身高差。

输入格式

Line 1: Two space-separated integers, N and Q.

Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i

Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.

第一行两个数 �,�n,q。

接下来 �n 行,每行一个数 ℎ�hi​。

再接下来 �q 行,每行两个整数 �a 和 �b,表示询问第 �a 头牛到第 �b 头牛里的最高和最低的牛的身高差。

输出格式

Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.

输出共 �q 行,对于每一组询问,输出每一组中最高和最低的牛的身高差。

输入输出样例

输入 #1复制

6 3
1
7
3
4
2
5
1 5
4 6
2 2

输出 #1复制

6
3
0

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} const int N=5e4+5;int n,q,st1[N][18],st2[N][18];signed main(){n=read(),q=read();for (int i=1;i<=n;++i){st1[i][0]=st2[i][0]=read();}//预处理for (int j=1;j<=18;++j){for (int i=1;i+(1<<(j-1))-1<=n;++i){st1[i][j]=max(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);st2[i][j]=min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);}}//查询for (int i=1;i<=q;++i){int l=read(),r=read();int x=__lg(r-l+1);int ma=max(st1[l][x],st1[r-(1<<x)+1][x]);int mi=min(st2[l][x],st2[r-(1<<x)+1][x]);cout<<ma-mi<<endl;} 
} 

最近公共祖先(LCA)https://www.luogu.com.cn/problem/P3379

题目描述

如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入格式

第一行包含三个正整数 �,�,�N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 �−1N−1 行每行包含两个正整数 �,�x,y,表示 �x 结点和 �y 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 �M 行每行包含两个正整数 �,�a,b,表示询问 �a 结点和 �b 结点的最近公共祖先。

输出格式

输出包含 �M 行,每行包含一个正整数,依次为每一个询问的结果。

输入输出样例

输入 #1复制

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5

输出 #1复制

4
4
1
4
4

说明/提示

对于 30%30% 的数据,�≤10N≤10,�≤10M≤10。

对于 70%70% 的数据,�≤10000N≤10000,�≤10000M≤10000。

对于 100%100% 的数据,1≤�,�≤5000001≤N,M≤500000,1≤�,�,�,�≤�1≤x,y,a,b≤N,不保证 �≠�a=b。

对于LCA问题:

步骤1:建树,建树过程中,需要把每个节点的深度找到,因为最近的祖先的深度一定是一样的

这里先通过链式前向星存图:

void add(int u,int v){e[++tot].from=u;e[tot].to=v;e[tot].next=head[u];head[u]=tot;
}

通过DFS建树:

建树的过程有几点:

第一个循环中,i的大小要小于等于它本身节点的深度

第一个循环中的递推式表示的含义是:节点v向上走2^i个节点就等于了节点v先走了2^(i-1)个节点,然后再走了2^(i-1)个节点

void dfs(int v,int fa){dep[v]=dep[fa]+1;f[v][0]=fa;for (int i=1;(1<<i)<=dep[v];++i){f[v][i]=f[f[v][i-1]][i-1];}for (int i=head[v];i;i=e[i].next){int p=e[i].to;if (p==fa) continue;dfs(p,v);}
}

查询功能:

int LCA(int x,int y){if (dep[x]<dep[y]) swap(x,y);  //规定x的深度要大于yfor (int i=20;i>=0;--i){    //x向上找节点,直到深度与y相同if (dep[f[x][i]]>=dep[y]) x=f[x][i];if (x==y) return x;}
/*    
//等价
while(dep[x] > dep[y]){x=f[x][__lg(dep[x]-dep[y]-1)];}if (x==y) return x;
*/for (int i=20;i>=0;--i){    //x,y一起共同的向上找祖先,这里是从上向下找if (f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} const int N=5e5+5;struct edge{int from;int to;int next;
}e[N*2];int n,m,s,f[N][25],tot,head[N],dep[N];void add(int u,int v){e[++tot].from=u;e[tot].to=v;e[tot].next=head[u];head[u]=tot;
}void dfs(int v,int fa){dep[v]=dep[fa]+1;f[v][0]=fa;for (int i=1;(1<<i)<=dep[v];++i){f[v][i]=f[f[v][i-1]][i-1];}for (int i=head[v];i;i=e[i].next){int p=e[i].to;if (p==fa) continue;dfs(p,v);}
}int LCA(int x,int y){if (dep[x]<dep[y]) swap(x,y);for (int i=20;i>=0;--i){if (dep[f[x][i]]>=dep[y]) x=f[x][i];if (x==y) return x;}for (int i=20;i>=0;--i){if (f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}signed main(){n=read(),m=read(),s=read();for (int i=0;i<n-1;++i){int u=read(),v=read();add(u,v);add(v,u);}dfs(s,0);for (int i=0;i<m;++i){int a=read(),b=read();cout<<LCA(a,b)<<endl;}
}

景区导游https://www.dotcpp.com/oj/problem3156.html

题目描述

某景区一共有 N 个景点,编号 1 到 N。景点之间共有 N − 1 条双向的摆渡车线路相连,形成一棵树状结构。在景点之间往返只能通过这些摆渡车进行,需要花费一定的时间。

小明是这个景区的资深导游,他每天都要按固定顺序带客人游览其中 K 个景点:A1, A2, . . . , AK。今天由于时间原因,小明决定跳过其中一个景点,只带游客按顺序游览其中 K − 1 个景点。具体来说,如果小明选择跳过 Ai,那么他会按顺序带游客游览 A1, A2, . . . , Ai−1, Ai+1, . . . , AK, (1 ≤ i ≤ K)。

请你对任意一个 Ai,计算如果跳过这个景点,小明需要花费多少时间在景点之间的摆渡车上?

输入格式

第一行包含 2 个整数 N 和 K。

以下 N − 1 行,每行包含 3 个整数 u, v 和 t,代表景点 u 和 v 之间有摆渡车线路,花费 t 个单位时间。

最后一行包含 K 个整数 A1, A2, . . . , AK 代表原定游览线路。

输出格式

输出 K 个整数,其中第 i 个代表跳过 Ai 之后,花费在摆渡车上的时间。

样例输入

复制

6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1

样例输出

复制

10 7 13 14

提示

原路线是 2 → 6 → 5 → 1。

当跳过 2 时,路线是 6 → 5 → 1,其中 6 → 5 花费时间 3 + 2 + 2 = 7,5 → 1 花费时间 2 + 1 = 3,总时间花费 10。

当跳过 6 时,路线是 2 → 5 → 1,其中 2 → 5 花费时间 1 + 1 + 2 = 4,5 → 1 花费时间 2 + 1 = 3,总时间花费 7。

当跳过 5 时,路线是 2 → 6 → 1,其中 2 → 6 花费时间 1 + 1 + 2 + 3 = 7,6 → 1 花费时间 3 + 2 + 1 = 6,总时间花费 13。

当跳过 1 时,路线时 2 → 6 → 5,其中 2 → 6 花费时间 1 + 1 + 2 + 3 = 7,6 → 5 花费时间 3 + 2 + 2 = 7,总时间花费 14。

对于 20% 的数据,2 ≤ K ≤ N ≤ 102。

对于 40% 的数据,2 ≤ K ≤ N ≤ 104。

对于 100% 的数据,2 ≤ K ≤ N ≤ 105,1 ≤ u, v, Ai ≤ N,1 ≤ t ≤ 105。保证Ai 两两不同。

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3finline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
} const int N=5e5+5;struct edge{int from;int to;int next;int d;
}e[N*2];int n,m,s,f[N][20],tot,head[N],dep[N],dis[N],luxian[N];void add(int u,int v,int d){e[++tot].from=u;e[tot].d=d;e[tot].to=v;e[tot].next=head[u];head[u]=tot;
}void dfs(int v,int fa,int d){dep[v]=dep[fa]+1;f[v][0]=fa;dis[v]=d;for (int i=1;(1<<i)<=dep[v];++i){f[v][i]=f[f[v][i-1]][i-1];}for (int i=head[v];i;i=e[i].next){int p=e[i].to;if (p==fa) continue;dfs(p,v,dis[v]+e[i].d);}
}int LCA(int x,int y){if (dep[x]<dep[y]) swap(x,y);for (int i=__lg(n);i>=0;--i){if (dep[f[x][i]]>=dep[y]) x=f[x][i];if (x==y) return x;}for (int i=__lg(n);i>=0;--i){if (f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}int get(int x,int y){return dis[x]+dis[y]-2*dis[LCA(x,y)];
}signed main(){n=read(),m=read();for (int i=0;i<n-1;++i){int u=read(),v=read(),d=read();add(u,v,d);add(v,u,d);}dfs(1,0,0);for (int i=1;i<=m;++i){luxian[i]=read();}int sum=0;for (int i=1;i<m;++i){sum+=get(luxian[i],luxian[i+1]);}for (int i=1;i<=m;++i){int ans=sum;if (i!=1) ans-=get(luxian[i],luxian[i-1]);if (i!=m) ans-=get(luxian[i],luxian[i+1]);if (i!=1 && i!=m) ans+=get(luxian[i-1],luxian[i+1]);cout<<ans<<" ";}
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本&#xff0c;旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求&#xff0c;从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

java基于redis实现分布式锁

文章目录 前言一、redis二、Redisson1.引入库2. 分布式锁3. 锁自动续期 总结 前言 上篇文章介绍了Java中锁的应用,在SpringBoot单体应用中完全够用,但是SpringCloud微服务集群中就力所不及了。 我的使用场景是某些微服务应用中使用spring注解的形式来完成定时任务的功能,服务集…

深度学习系列59:文字识别

1. 简单文本&#xff1a; 使用google加的tesseract&#xff0c;效果不错。 首先安装tesseract&#xff0c;在mac直接brew install即可。 python调用代码&#xff1a; import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…

规则持久化(Sentinel)

规则持久化 基于Nacos配置中心实现推送 引入依赖 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId> </dependency> 流控配置文件 [{"resource":"/order/flow",…

基于MybatisPlus实现的代码生成插件

1. 前言 目前市面上基于Mybatis或MybatisPlus的代码生成器或插件有很多&#xff0c;本人前几年也开发了一款&#xff1a;基于SpringBoot微服务代码自动生成插件。之前的开发的这款插件底层使用的持久层框架是通用mapper&#xff0c;不是现在主流的MyBatisPlus&#xff0c;而且只…

每个学计算机同学都应该有个创业梦

推荐计算机专业必看的两部电影 经典记录片电影《社交网络》推荐理由豆瓣评分电影简介 德国犯罪喜剧《如何在网上卖迷幻药》推荐理由剧情简介 两部电影主角对比 经典记录片电影《社交网络》 纪录扎克伯格&#xff0c;7年时间&#xff0c;从一名大学生摇身变成亿万富翁的故事 推荐…

瑞_23种设计模式_桥接模式

文章目录 1 桥接模式&#xff08;Bridge Pattern&#xff09;1.1 介绍1.2 概述1.3 桥接模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二2.1 需求2.1 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《23种设计模式》的桥接模式篇。本文中的部分图和概念等资料…

基于虚拟力优化的无线传感器网络覆盖率matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率&#xff0c;仿真输出优化前后的网络覆盖率&#xff0c;覆盖率优化收敛迭代曲线…

Linux系统——Nginx小总结

目录 一、影响用户体验的因素 二、网络连接——Apache/Nginx服务请求过程 三、I/O模型——Input/Output模型 1.同步/异步 2.阻塞/非阻塞 3.同步异步/阻塞非阻塞组合 四、Nginx用法 一、影响用户体验的因素 客户端硬件配置客户端网络速率客户端与服务端距离服务端网络速…

Programming Abstractions in C阅读笔记:p293-p302

《Programming Abstractions in C》学习第73天&#xff0c;p293-p302总结&#xff0c;总计10页。 一、技术总结 1.时间复杂度 (1)quadratic time(二次时间) p293, Algorithms like selection sort that exhibit O(N^2) performance are said to run in quadratic time。 2…

K线实战分析系列之九:顶底判断——流星和倒锤子线

K线实战分析系列之九&#xff1a;顶底判断——流星和倒锤子线 一、流星线二、倒锤子线三、总结流星形态和倒锤子形态 一、流星线 主要特征是实体比较小&#xff0c;位于低端位置&#xff0c;带着长上影线&#xff0c;就像流星划过天际时&#xff0c;拖着一个长长的尾巴&#xf…

【深度学习笔记】 3_13 丢弃法

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.13 丢弃法 除了前一节介绍的权重衰减以外&#xff0c;深度学习模型常常使用丢弃法&#xff08;dropout&#xff09;[1] 来应对过拟合…

K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Shell grep命令练习题

目录 1含有“48“字符串的行的总数 2显示含有“48“字符串的所有行的行号 3精确匹配只含有“48”字符串的行 4抽取代码为484和483的城市位置 5显示使行首不是4或8 6显示含有九月份(Sept)的行 7显示以K开头&#xff0c;以D结尾的所有代码 8显示头两个是大写字母&#xff0c;中间…

《VitePress 简易速速上手小册》第4章 博客功能增强(2024 最新版)

文章目录 4.1 添加搜索功能4.1.1 基础知识点解析4.1.2 重点案例:集成 Algolia 搜索4.1.3 拓展案例 1:自定义客户端搜索4.1.4 拓展案例 2:实现服务器端搜索4.2 评论系统集成4.2.1 基础知识点解析4.2.2 重点案例:集成 Disqus4.2.3 拓展案例 1:使用 Facebook Comments4.2.4 拓…

AD24-PCB尺寸标注、LOGO添加、装配图即多层线路PC输出

一、PCB尺寸标注 1、切换到机械层 2、按shifee进行捕捉切换 按TAB键或空格键进行横向和纵向标注切换 二、LOGO添加 1、放置-图形 2、在空白位置线绘制一个框 3、进行大小调整 三、装配图输出 1、 导出原材料BOM表&#xff0c;不要勾选 顶层 底层 颜色设置 2、输出只有Value值…

数据结构 计算结构体大小

一、规则&#xff1a; 操作系统制定对齐量&#xff1a; 64位操作系统&#xff0c;默认8Byte对齐 32位操作系统&#xff0c;默认4Byte对齐 结构体对齐规则&#xff1a; 1.结构体整体的大小&#xff0c;需要是最大成员对齐量的整数倍 2.结构体中每一个成员的偏移量需要存在…

数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS

&#x1f680;数字人的未来&#xff1a;数字人对话系统 Linly-Talker 克隆语音 GPT-SoVITS https://github.com/Kedreamix/Linly-Talker 2023.12 更新 &#x1f4c6; 用户可以上传任意图片进行对话 2024.01 更新 &#x1f4c6; 令人兴奋的消息&#xff01;我现在已经将强…

花生壳内网穿透教程(图文并茂)

目录 前言&#xff1a; 使用教程&#xff1a; 1.注册账号 2.软件下载及安装&#xff1a; 3.账号绑定及花生壳的使用 4.内网穿透的配置&#xff08;重点&#xff09; 4.2 新增映射页面&#xff1a; 4.3 上面几种映射的区别&#xff1a; 4.4 上面TCP类型的区别&#xff1a;…

PHATGOOSE:使用LoRA Experts创建低成本混合专家模型实现零样本泛化

这篇2月的新论文介绍了Post-Hoc Adaptive Tokenwise Gating Over an Ocean of Specialized Experts (PHATGOOSE)&#xff0c;这是一种通过利用一组专门的PEFT模块(如LoRA)实现零样本泛化的新方法 这个方法冻结整个模型&#xff0c;包括PEFT模块&#xff0c;并为每个模块训练一…