牛客周赛 Round 38(A,B,C,D,E,F,G)

比赛链接

官方讲解(不分P不分段直接两小时怼上来是坏文明

这场的题很棒,思维有难度,考察的知识点广泛,有深度,很透彻。感觉学到了很多。建议补题。


A 小红的正整数自增

思路:

签到。

可以模拟一下,看加上几次,个位就变成 0 0 0 了。

或者可以用 10 10 10 减一下个位数,看看离进位差几。

code:

#include <cstdio>
#include <iostream>
using namespace std;

int n;

int main(){
	cin>>n;
	cout<<(10-n%10)%10;
	return 0;
}

B 小红的抛弃后缀

思路:

有一个初等数论的知识点可以秒掉此题: 一个数是 9 的倍数 ⇔ 这个数十进制数码的和能被 9 整除 一个数是 9 的倍数\Leftrightarrow这个数十进制数码的和能被9整除 一个数是9的倍数这个数十进制数码的和能被9整除

比如 1233 1233 1233 的各个数位上的数分别为 1 , 2 , 3 , 3 1,2,3,3 1,2,3,3,它们的和 1 + 2 + 3 + 3 = 9 1+2+3+3=9 1+2+3+3=9 可以被 9 9 9 整除,那么 1233 1233 1233 这个数就可以被 9 9 9 整除,反之也成立。

所以我们删掉一个后缀使得剩余的数能被 9 9 9 整除,其实就相当于去验证剩余的前缀的数字之和能被 9 9 9 整除即可。

我们跑一遍前缀和,并检查每个前缀和能否被 9 9 9 整除。能被整除的前缀和的个数就是答案。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=1e5+5;

int n,s[maxn],ans;
string str;

int main(){
	cin>>str;
	n=str.length();
	str=" "+str;
	
	for(int i=1;i<=n;i++){
		s[i]=(s[i-1]+str[i]-'0')%9;
		if(!s[i])ans++;
	}
	cout<<ans<<endl;
	return 0;
}

不止 9 9 9 有这种性质,其他很多数也有各种不同的性质。它们基本都是通过同余的性质来证明的,证明可以看:初等数论-同余性质的应用。


C 小红的字符串构造

思路:

如果我们全部填入一个相同的字母,那么最多可以出现 1 + 2 + 3 + ⋯ + n − 1 = n ∗ ( n − 1 ) 2 1+2+3+\dots+n-1=\dfrac{n*(n-1)}{2} 1+2+3++n1=2n(n1) 个回文串,但是题目却保证 k ≤ n 2 k\le \dfrac{n}2 k2n,这就很奇怪。

考虑到我们两个相同的字母放在一起就可以用两个字符组成一个回文串,这就正好和题目的 k ≤ n 2 k\le \dfrac{n}2 k2n 对应上了。所以我们用 a a b b c c a a b b c c … aabbccaabbcc\dots aabbccaabbcc 这种方式来组回文串——两个字符组成一个回文串,为了防止出现其他回文串,需要至少三种字符来进行循环。

k k k 个回文串,那么前面需要 2 k 2k 2k 个字符来凑。后面多余的位置就可以用 d e f d e f d e f … defdefdef\dots defdefdef 这种方式来填充,同样的为了防止出现回文串,需要至少三种字符进行循环。

code:

"abc"[i%3] 相当于

char str[]="abc";

str[i%3];

前面的字符串相当于一个匿名的字符数组。并且占有空间(应该?)。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n,k;
string s;

int main(){
	cin>>n>>k;
	for(int i=1;i<=k;i++){
		s+="abc"[i%3];
		s+="abc"[i%3];
	}
	for(int i=2*k+1;i<=n;i++)
		s+="def"[i%3];
	cout<<s<<endl;
	return 0;
}

D 小红的平滑值插值

思路:

发现如果相邻两项的差值超过了 k k k,我们就需要向中间插入数字,将这个差值降下来。

而降差值的时候可以贪心地来进行,即每差 k k k 才插一个,差值要是还大就继续插,够了就往下看。这样如果差值为 d d d 的话,我们需要插 ⌈ d k ⌉ − 1 = ⌊ d − 1 k ⌋ \left\lceil\dfrac{d}{k}\right\rceil-1=\left\lfloor\dfrac{d-1}{k}\right\rfloor kd1=kd1个数。

不过如果中间不存在一个差值大于等于 k k k 的位置的话,我们就需要人为造一个差值为 k k k 的相邻的数。比如在最后补一个数,使得它和前面那个数差值为 k k k。所以我们需要看一下中间有没有一个差值大于等于 k k k 的位置。

code:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;

int n,k,a[maxn];
long long cnt=0;

int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	bool flag=false;
	for(int i=1,d;i<n;i++){
		d=abs(a[i]-a[i+1]);
		if(d>=k){
			cnt+=(d-1)/k;
			flag=true;
		}
	}
	if(!flag)cnt++;
	cout<<cnt<<endl;
	return 0;
}

E 小苯的等比数列

思路:

没想到被一个 1799 1799 1799 rate 的比赛的 E E E 题单防了。

这个题的思路其实很简单:就是枚举每一个数,让它作为等比数列的首项,并枚举公比,暴力进行验证即可。

当然需要一点点优化,因为每个数的值域很小,所以我们直接可以把每个数桶排序一下,把它扔进桶里,这样查找一个数的时间复杂度就可以降为 O ( 1 ) O(1) O(1) 的。不过公比为 1 1 1 的情况会不停验证下去,所以需要特判解决,我们之前用桶可以直接记录每个数的个数,就可以解决掉公比为 1 1 1 的情况。这时候再暴力就可以做到接近 O ( n ∗ l o g   n ) O(n*log\,n) O(nlogn) 的逆天时间复杂度。

为啥时间复杂度这么低?枚举每个数当然是 O ( n ) O(n) O(n) 的,而对每个公比 d d d,我们最多只需要验证到 n d \dfrac{n}{d} dn 个公比就可以直接返回了(因为后面的数,数列第二项就会直接超出 2 ∗ 1 0 5 2*10^5 2105),而每个公比只需要验证 l o g d ( 2 ∗ 1 0 5 ) log_d(2*10^5) logd(2105) 次就会超出 2 ∗ 1 0 5 2*10^5 2105 的值域范围。可以写个程序打个表:(第一行是公比 d d d,第二行是执行次数 l o g d ( 2 ∗ 1 0 5 ) log_d(2*10^5) logd(2105)
在这里插入图片描述
其实平均每个公比也就跑了 2.00278 次。所以总的时间复杂度大概就是 O ( n 2 + n 3 + ⋯ + n n ≈ n ∗ l o g   n ) O(\dfrac n2+\dfrac n3+\dots+\dfrac nn\approx n*log\,n) O(2n+3n++nnnlogn),然后带上一点常数,所以这样暴力跑是不会超时的。逆天。

code:

#include <iostream>
#include <cstdio> 
#include <vector>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;

int n,vis[maxn],ans;

int main(){
	cin>>n;
	for(int i=1,t;i<=n;i++){
		cin>>t;
		vis[t]++;
	}
	for(ll a0=1;a0<=2e5;a0++){
		if(!vis[a0])continue;
		ans=max(ans,vis[a0]);
		for(ll d=2;d<=2e5;d++){
			if(a0*d>2e5)break;
			int cnt=1;
			for(ll a=a0*d;;a*=d){
				if(a>2e5 || !vis[a]){
					ans=max(ans,cnt);
					break;
				}
				else cnt++;
			}
		}
	}
	cout<<ans<<endl;
	
	return 0;
}

F 小苯的回文询问

思路1(莫队):

发现是离线的区间询问,可以尝试使用莫队!借鉴这位大佬的。

考虑到是子序列长度 > 2 >2 >2 的回文串。所以我们只要保证有 有两个相同的数中间隔了一些数 这种情况出现就行。但是想用莫队就需要通过一些参数来描述上面这种情况,并且 [ l , r ] [l,r] [l,r] 区间的参数可以 O ( 1 ) O(1) O(1) 拓展到相邻的 [ l − 1 , r ] , [ l + 1 , r ] , [ l , r − 1 ] , [ l , r + 1 ] [l-1,r],[l+1,r],[l,r-1],[l,r+1] [l1,r],[l+1,r],[l,r1],[l,r+1] 区间。

两个相同的数中间隔了一些数的话,相当于需要两个相同的数不相邻,或者有三个及以上的相同的数。所以我们用 f 1 f1 f1 变量记录三个及以上的相同的数的个数,用 f 2 f2 f2 变量记录两个相同的数的个数。

如果 f 1 > 0 f1>0 f1>0 那么一定是有回文串的。如果 f 1 = = 0 f1==0 f1==0,这时候我们需要保证 两个相同的数 至少有一对不相邻,所以我们可以设置一个变量 s u m sum sum,记录相邻的相同的数有几对,如果 f 2 ! = s u m f2 !=sum f2!=sum,就说明至少有一对相同的数不相邻,这时也有回文串。

不过每个数的值域太大了,如果使用 m a p map map,时间会多出一个 l o g log log,总的时间复杂度为 O ( n ∗ l o g   n + q n ∗ l o g   n ) O(n*log\,n+q\sqrt n*log\,n) O(nlogn+qn logn),会超时。所以我们对每个数离散化预处理一下,这样时间复杂度就变成了 O ( n ∗ l o g   n + q n ) O(n*log\,n+q\sqrt n) O(nlogn+qn ),可以通过。

code1:

上面那个大佬写的更加优美。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
const int maxn=1e5+5;

int n,q;

int len,tot;
int a[maxn],L[maxn],R[maxn],belong[maxn];

void init(){
	len=log2(n);
	tot=(n+len-1)/len;
	for(int i=1;i<=tot;i++){
		L[i]=R[i-1]+1;
		R[i]=i*len;
	}
	R[tot]=n;
	for(int i=1;i<=tot;i++)
		for(int j=L[i];j<=R[i];j++)
			belong[j]=i;
}

struct itv{
	int l,r,id;
	bool ans;
}qy[maxn<<1];

bool cmp1(const itv a,const itv b){return (belong[a.l]^belong[b.l])?a.l<b.l:((belong[a.l]&1)?a.r<b.r:a.r>b.r);}
bool cmp2(const itv a,const itv b){return a.id<b.id;}

int f1,f2,sum;
//map<int,int> mp;
int mp[maxn];
void add(int x){
	mp[x]++;
	if(mp[x]==2)f1++;
	else if(mp[x]==3)f2++;
}
void del(int x){
	if(mp[x]==2)f1--;
	else if(mp[x]==3)f2--;
	mp[x]--;
}

vector<int> ttt;
int find(int x){
	return lower_bound(ttt.begin(),ttt.end(),x)-ttt.begin()+1;
}

int main(){
	cin>>n>>q;
	init();
	for(int i=1;i<=n;i++)cin>>a[i],ttt.push_back(a[i]);
	sort(ttt.begin(),ttt.end());
	ttt.erase(unique(ttt.begin(),ttt.end()),ttt.end());
	for(int i=1;i<=n;i++)a[i]=find(a[i]);
//	for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
	
	for(int i=1;i<=q;i++)cin>>qy[i].l>>qy[i].r,qy[i].id=i;
	sort(qy+1,qy+q+1,cmp1);
	
	int tl=1,tr=0,cnt=0;
	for(int i=1,l,r,t;i<=q;i++){
		l=qy[i].l;
		r=qy[i].r;
		while(tr<r){
			add(a[++tr]);
			if(a[tr]==a[tr-1])sum++;
		}
		while(tr>r){
			if(a[tr]==a[tr-1])sum--;
			del(a[tr--]);
		}
		while(tl<l){
			if(a[tl]==a[tl+1])sum--;
			del(a[tl++]);
		}
		while(tl>l){
			add(a[--tl]);
			if(a[tl]==a[tl+1])sum++;
		}
		
		if(f2 || (f1 && sum!=f1))qy[i].ans=true;
	}
	
	sort(qy+1,qy+q+1,cmp2);
	for(int i=1;i<=q;i++)
		puts((qy[i].ans)?"YES":"NO");
	return 0;
}

思路2:

同样的,我们想要两个相同的数中间隔了一些数的话,这时就是有回文子序列的。那么我们可以处理出每个位置的数的前一个不相邻的相同数的位置,假设是 l s t [ i ] lst[i] lst[i]。这样,对一个区间,我们只要保证 [ l , r ] [l,r] [l,r] 区间里有一个 l s t [ i ] ≥ l lst[i]\ge l lst[i]l 即可。

因为只要存在一个这样的 l s t [ i ] lst[i] lst[i] 就行,所以我们查询 l s t lst lst 的区间最大值,只要这个最大值满足条件就行了。而区间离线询问,可以跑线段树,ST表啊之类的都可以。

不过发现一个性质,就是 l s t [ i ] < i lst[i]<i lst[i]<i。所以在 i < l i<l i<l 的位置,都满足 l s t [ i ] < l lst[i]<l lst[i]<l,这意味着 l s t [ i ] > l lst[i]>l lst[i]>l 的情况一定发生在 i ∈ [ l , r ] i\in [l,r] i[l,r] 的区间内,查询最大值的时候加入前缀不会影响结果大于等于l。因此我们直接处理出 l s t lst lst 的前缀 m a x max max,然后查询是否满足 l s t [ r ] ≥ l lst[r]\ge l lst[r]l 就行了。

code2:

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=1e5+5;

int n,q;
int a[maxn],lst[maxn];
map<int,int> mp;

int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		lst[i]=mp[a[i]];
		mp[a[i]]=i;
	}
	for(int i=n;i>=1;i--)
		if(lst[i]==i-1)
			lst[i]=lst[lst[i]];
	for(int i=2;i<=n;i++)
		lst[i]=max(lst[i-1],lst[i]);
	for(int i=1,l,r;i<=q;i++){
		cin>>l>>r;
		puts((lst[r]>=l)?"YES":"NO");
	}
	return 0;
}

G 小红的区间删除

思路:

区间删除很难想,不如先看看单点删除。一个数放在某个位置上可以产生多少逆序对,就说明被删掉后会失去多少逆序对。而在某个位置插入一个数的话,它会和这个位置之前的每个比它大的数产生一对逆序对,以及和这个位置之后的每个比它小的数产生一对逆序对。

因此我们删掉一个点的剩余逆序对对数,相当于总的逆序对个数要减去 序列中在这个位置之前的比它大的数的个数和这个位置之后的比它小的数的个数。而区间删除就是一个点一个点地删掉。

我们要删掉中间一段连续的区间,然后剩余的部分的逆序对个数 ≥ k \ge k k,所以我们可以通过上面的单点修改一个一个删掉中间的部分,得到剩余部分的逆序对个数。

因为我们删掉的数越多,逆序对数就越少,它是单调的。所以我们只要对每个右端点 r r r 找到满足条件的最小的 l l l,那么中间所有的位置都可以作为满足条件的左端点。而也因为是单调的,我们可以使用双指针来移动左右端点。这样移动指针的复杂度就降为了 O ( n ) O(n) O(n),移动一次的复杂度为 O ( l o g   n ) O(log\,n) O(logn),可以通过。

不过因为什么都不删也是一种方法,所以我们需要特判一下,如果什么都不删都不满足条件,就直接输出 0 0 0。否则答案额外加上这个特殊情况。

值域给的很贴心,不用离散化了。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int maxf=1e6+5;

int n;
ll k;
int a[maxn];

ll cnt=0,ans;//剩余部分逆序对个数 答案 
struct tree_array{
	const int _n=1e6;
	int tr[maxf];
	
	int lowbit(int x){return x&-x;}
	void add(int idx,int x){
		for(int i=idx;i<=_n;i+=lowbit(i))
			tr[i]+=x;
	}
	int query(int idx){
		int ans=0;
		for(int i=idx;i;i-=lowbit(i))
			ans+=tr[i];
		return ans;
	}
	int qpre(int idx){//<idx的数个数 
		return query(idx-1);
	}
	int qsuf(int idx){//>idx的数个数 
		return query(_n)-query(idx);
	}
}t1,t2;



int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		cnt+=t2.qsuf(a[i]);
		t2.add(a[i],1);
	}
	if(cnt>=k)ans=1;
	else return cout<<0,0;
	
	for(int l=1,r=1;r<=n;r++){
		//删掉a[r] 
		cnt-=t1.qsuf(a[r])+t2.qpre(a[r]);
		t2.add(a[r],-1);
		
		//加入a[l] 
		while(l<=r && cnt<k){
			cnt+=t1.qsuf(a[l])+t2.qpre(a[l]);
			t1.add(a[l],1);
			l++;
		}
		ans+=(r-l+1);
	}
	cout<<ans<<endl;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s的pod访问service的方式

背景 在k8s中容器访问某个service服务时有两种方式&#xff0c;一种是把每个要访问的service的ip注入到客户端pod的环境变量中&#xff0c;另一种是客户端pod先通过DNS服务器查找对应service的ip地址&#xff0c;然后在通过这个service ip地址访问对应的service服务 pod客户端…

Python面对对象 - 类的反射机制

Python面对对象类的反射机制是面向对象编程语言中比较重要的功能&#xff0c;可以动态获取对象信息以及动态调用对象。通过字符串形式的类名或属性来访问对应类或属性。 一、对象的反射 1. getattr 获取指定字符串名称的对象属性、方法&#xff1a; 当访问的属性不存在时&#…

AtCoder Beginner Contest 347(A~D)

A - Divisible 如果序列里面的数能被k整除&#xff0c;就整除后输出 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);--(i)) #define debug(a) cout<<#a<…

Android ImageView 的scaleType 属性图解

目录 前言测试素材测试布局xmlscaleType前言 一、ScaleType.FIT_CENTER 默认二、ScaleType.FIT_START三、ScaleType.FIT_END四、ScaleType.FIT_XY五、ScaleType.CENTER六、ScaleType.CENTER_CROP七、ScaleType.CENTER_INSIDE八、ScaleType.MATRIX 前言 原文链接&#xff1a; A…

macOS搭建php环境以及调试Symfony

macOS搭建php环境以及调试Symfony macOS搭建php环境以及调试Symfony 古老的传说运行环境快速前置安装环境 php 的安装安装 Xdebug 来调试 php如何找到你的 php.iniXdebug 安装成功 创建并调试的 Hello world 安装 PHP Debug 安装 Symfony 安装 Composer安装 Symfony CLI 创建 …

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包&#xff0c;然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…

HarmonyOS 应用开发之FA模型访问Stage模型DataShareExtensionAbility

概述 无论FA模型还是Stage模型&#xff0c;数据读写功能都包含客户端和服务端两部分。 FA模型中&#xff0c;客户端是由DataAbilityHelper提供对外接口&#xff0c;服务端是由DataAbility提供数据库的读写服务。 Stage模型中&#xff0c;客户端是由DataShareHelper提供对外接…

【重学C语言】二、C语言简介和开发工具

【重学C语言】二、C语言简介和开发工具 C语言发展史C语言标准变迁C语言特点开发软件CLion安装步骤 VIsual Studio安装步骤 Clion 和 VS2022 绑定 VS 项目创建项目 Clion 项目(本博主主用)创建项目Clion 配置 构建类型构建模式 C语言发展史 1970年&#xff0c;美国 AT&T 公…

leetcode.209.长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#…

JDK和IntelliJ IDEA下载和安装及环境配置教程

一、JDK下载&#xff08;点击下方官网链接&#xff09; Java Downloads | Oracle 选择对应自己电脑系统往下拉找到自己想要下载的JDK版本进行下载&#xff0c;我下的是jdk 11&#xff0c;JDK有安装版和解压版&#xff0c;我就直接下安装版的了。 .exe和.zip的区别&#xff1a…

设计模式10--适配器模式

定义 案例一 案例二 优缺点

稀碎从零算法笔记Day34-LeetCode:最小栈

感谢耶稣&#xff0c;笔者又过了一天“复活节”。月末斩杀一道Hard画上句号 题型&#xff1a;栈、模拟数据结构 链接&#xff1a;155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 设计一个支持 push &#xff0c;pop &#xff0c;…

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…

阿里云轻量应用服务器优惠价格表,61元和165元一年

阿里云轻量应用服务器2核2G和2核4G配置优惠价格表&#xff0c;轻量2核2G3M带宽61元一年&#xff0c;轻量2核4G4M带宽165元1年&#xff0c;均不限制月流量&#xff0c;阿里云活动链接 aliyunfuwuqi.com/go/aliyun 活动打开如下图&#xff1a; 阿里云轻量应用服务器价格 61元/年…

线程池详解、核心参数、拒绝策略

什么是线程池 线程池是一种池化技术&#xff0c;它预先创建一组线程&#xff0c;用于执行异步任务。当有新任务到来时&#xff0c;线程池可以立即分配一个线程来处理&#xff0c;而不需要临时创建。这样可以减少因为频繁创建和销毁线程而导致的开销。 线程池的应用场景 高并…

C++中使用虚函数实现多态

虚函数是C中用于实现多态&#xff08;Polymorphism&#xff09;的重要特性。下面是关于虚函数的讲解和代码示例&#xff1a;### 虚函数的定义&#xff1a; 虚函数是在基类中声明为 virtual 的成员函数。 在派生类中重写&#xff08;override&#xff09;这个虚函数&#xff0c;…

C语言分支循环探秘:解锁编程逻辑的无限可能 篇章1

目录 1.if语句 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&&&#xff0c;||&#xff0c;&#xff01; 5.switch语句 6.while循环 7.for循环 8.do-while循环 9.break和continue语句 10.循环的嵌套 11.goto 导入 C语言是结构化的程序设计语言&…

STM32 | PWM脉冲宽度调制(第五天按键中断,控制电机正/反转、加速、减速、暂停与继续源码解析)

​ STM32 | PWM脉冲宽度调制(第五天)STM32 | PWM脉冲宽度调制(第五天呼吸灯源码解析)STM32 | PWM脉冲宽度调制(第五天电机速度控制源码解析)PWM 技术在以下其他机器学习领域和应用中也可以发挥作用: 自然语言处理 (NLP):调节文本生成模型(例如 GPT-3)的输出长度和多样…

简明Pytorch分布式训练 — DistributedDataParallel 实践

上一次的Pytorch单机多卡训练主要介绍了Pytorch里分布式训练的基本原理&#xff0c;DP和DDP的大致过程&#xff0c;以及二者的区别&#xff0c;并分别写了一个小样作为参考。小样毕竟还是忽略了很多细节和工程实践时的一些处理方式的。实践出真知&#xff0c;今天&#xff08;简…

微服务(基础篇-007-RabbitMQ)

目录 初识MQ(1) 同步通讯&#xff08;1.1&#xff09; 异步通讯&#xff08;1.2&#xff09; MQ常见框架&#xff08;1.3&#xff09; RabbitMQ快速入门(2) RabbitMQ概述和安装&#xff08;2.1&#xff09; 常见消息模型&#xff08;2.2&#xff09; 快速入门&#xff…