2023牛客暑期多校第三场部分题解

2023-11-05

索引

A

直接输出两个数的差即可。再判一下无解的情况。

B

其实思路还挺顺的,首先拿的牌肯定是一段增一段减一段增一段减……的序列,并且 > n >n >n 的开头和 ≤ n \leq n n 的开头两种序列是对称的,我们随便考虑一种最后答案乘以二即可。

下面称 1 1 1 ~ n n n 的数为一堆, n + 1 n+1 n+1 ~ 2 n 2n 2n 为一堆。

为了避免计重,考虑在每个序列最后一张被取走的牌的那个位置统计答案,设 f i , j f_{i,j} fi,j 表示前 i i i 位合法的放置方案数,并且 i i i 不在的那一堆里还有 j j j 个没用过的数。

j j j 这一维存在的意义很明确,就是要用来转移的,先考虑对答案的贡献,分为两种:

  1. j j j 个全部按顺序用完,并且剩下没有数了(即 i + j = 2 n i+j=2n i+j=2n),则对答案产生贡献 2 n × f i , j 2n\times f_{i,j} 2n×fi,j
  2. 如果不是所有数都放完了,而且还要取走了最后一张牌(即后面不能取了),那么一定是出现了不合法的取法,即同一堆数不是按递减或递增顺序取的。假设最后这堆取了 k k k 张牌,那么一定是 k − 1 k-1 k1 张按顺序的以及 最后一张不按顺序的,贡献为 ( i + k ) × f i , j × C j k × ( k − 1 ) (i+k)\times f_{i,j}\times C_j^k\times (k-1) (i+k)×fi,j×Cjk×(k1),其中 k − 1 k-1 k1 表示选出来的 k k k 张牌中还要选一个放在最后(且不能是最小/最大的那张)。

f f f 的转移类似,具体可以看代码。

说起来多其实写起来很短,而且还没啥细节:

#include <bits/stdc++.h>
using namespace std;
#define maxn 610

int n,mod,C[maxn][maxn],fac[maxn];
void add(int &x,int y){x=(x+y>=mod?x+y-mod:x+y);}
int add(int x){return x>=mod?x-mod:x;}
int f[maxn][maxn];

int main()
{
	int Te;cin>>Te;while(Te--){
		cin>>n>>mod;
		for(int i=0;i<=2*n;i++){
			C[i][0]=1;
			for(int j=1;j<=i;j++)
				C[i][j]=add(C[i-1][j]+C[i-1][j-1]);
		}
		fac[0]=1;
		for(int i=1;i<=2*n;i++)
			fac[i]=1ll*fac[i-1]*i%mod;
		for(int i=0;i<=2*n;i++)
			for(int j=0;j<=n;j++)
				f[i][j]=0;
		f[0][n]=1;
		
		int ans=0;
		for(int i=0;i<2*n;i++){
			for(int j=1;i+j<=2*n&&j<=n;j++){
				if(i+j==2*n)add(ans,1ll*f[i][j]*2*n%mod);
				for(int k=2;k<=j;k++)
					add(ans,1ll*(i+k)*f[i][j]%mod*C[j][k]%mod*(k-1)%mod*fac[2*n-i-k]%mod);
			}
			for(int j=1;i+j<=2*n&&j<=n;j++)
				for(int k=1;k<=j;k++)
					if(2*n-i-j<=n)
						add(f[i+k][2*n-i-j],1ll*f[i][j]*C[j][k]%mod);
		}
		ans=2ll*ans%mod;
		cout<<ans<<'\n';
	}
}

D

手玩一下发现其实只有全 0 0 0 或全 1 1 1 的矩阵才是满足要求的。


考虑一个比较粗略的证明:

首先 0 ≤ r i , c j ≤ 2 n − 1 0\leq r_i,c_j\leq 2^n-1 0ri,cj2n1

假如第一列全是 1 1 1,那么 max ⁡ ( c j ) = 2 n − 1 \max(c_j) =2^n-1 max(cj)=2n1,则 min ⁡ ( r i ) = 2 n − 1 \min(r_i)=2^n-1 min(ri)=2n1,即所有行都是全 1 1 1

假如第一列存在一个 0 0 0 且不在第一行,那么 max ⁡ ( c j ) ≥ 2 n − 1 , min ⁡ ( r i ) < 2 n − 1 \max(c_j)\geq 2^{n-1},\min(r_i)<2^{n-1} max(cj)2n1,min(ri)<2n1,与条件不符,所以不可能出现。

所以第一列要是有 0 0 0,第一行必然有一个,此时 min ⁡ ( r i ) < 2 n − 1 \min(r_i)<2^{n-1} min(ri)<2n1,要使 max ⁡ ( c j ) < 2 n − 1 \max(c_j)<2^{n-1} max(cj)<2n1,则第一行不能有 1 1 1

由此可知,第一行全是 0 0 0,所以 min ⁡ ( r i ) = 0 \min(r_i)=0 min(ri)=0,故 max ⁡ ( c j ) = 0 \max(c_j)=0 max(cj)=0,即每一列都全是 0 0 0

证毕。

说着有点儿绕,总结起来就是:

  1. 第一列全是 1 → 1\red\to 1 所有行全是 1 1 1
  2. 第一列有 0 → 0\red\to 0 第一行肯定有 0 → 0\red\to 0第一行全是 0 → 0\red\to 0 所有列全是 0 0 0

所以考虑能不能将整个矩阵变成全 0 / 1 0/1 0/1 的矩阵。两种思路是一样的,就将变全 0 0 0 的吧。

首先每一行每一列至多翻转一次,重复翻转没意义。于是可以枚举第一行是否翻转,操作后假如第一行还有 1 1 1,那么只能翻转他所在的这一列来消除掉这个 1 1 1。接下来为了不改变第一行已经合法的状态,所以不能再翻转列了,看下面每一行需不需要翻转即可,假如有一行既有 1 1 1 也有 1 1 1 则无解。

其实是个很贪心很暴力的简单思路,代码如下:

#include <bits/stdc++.h>
using namespace std;
#define maxn 2010
#define inf 999999999

int n;
char s[maxn][maxn];
bool line[maxn],col[maxn];
int get(int x,int y){
	int re=s[x][y]-'0';
	return (re^line[x]^col[y]);
}
int solve(){
	int re=inf;
	for(int line1=0;line1<=1;line1++){
		memset(line,false,sizeof(line));
		memset(col,false,sizeof(col));
		line[1]=line1;
		int tot=line1;
		for(int i=1;i<=n;i++)
			if(get(1,i))col[i]=true,tot++;
		for(int i=2;i<=n;i++)
			if(get(i,1))line[i]=true,tot++;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(get(i,j))tot=inf;
		re=min(re,tot);
	}
	return re;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%s",s[i]+1);
	int ans=inf;
	ans=min(ans,solve());
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(s[i][j]=='1')s[i][j]='0';
			else s[i][j]='1';
	ans=min(ans,solve());
	if(ans>=2*n)puts("-1");
	else printf("%d",ans);
}

E

其实就是问 是否 dfs顺序如何变化整张图每个点的深度都不变

先跑一次bfs跑出每个点的深度,将图分层,考虑不在bfs树上的几种边 ( u , v ) (u,v) (u,v)

  1. 假如 d e p u + 1 = d e p v dep_u+1=dep_v depu+1=depv,那么这种边不影响答案
  2. 假如 d e p u + 1 ≠ d e p v dep_u+1\neq dep_v depu+1=depv,首先基于分层图的性质不可能是 d e p u + 1 < d e p v dep_u+1<dep_v depu+1<depv,那么只可能是 d e p u + 1 > d e p v dep_u+1>dep_v depu+1>depv,假如 v v v 不支配 u u u,那么一定存在一条路径会使得 v v v 能得到更大的深度。此时答案为 No。否则,这条边一定没用,因为遍历到 u u u 时一定已经遍历过 v v v 了, u u u 无法再更新 v v v

所以其实这题难点是会不会支配树……然而我还不会,但是上网膜了个板子魔改一下之后居然过了。

代码参考性也许不是很大:

#include<bits/stdc++.h>
using namespace std;
#define maxn 500010

#define cn getchar
template<class TY>void read(TY &x){
	x=0;int f1=1;char ch=cn();
	while(ch<'0'||ch>'9'){if(ch=='-')f1=-1;ch=cn();}
	while(ch>='0'&&ch<='9')x=x*10+(ch-'0'),ch=cn(); x*=f1;
}
template<class TY>void write2(TY x){
	if(x>9)write2(x/10);
	putchar(x%10+'0');
}
template<class TY>void write(TY x){
	if(x<0)putchar('-'),x=-x;
	write2(x);
}
int n,m,dfn[maxn],id[maxn],tot,dep[maxn];
int ffa[maxn],fa[maxn],semi[maxn],val[maxn],du[maxn],ff[25][maxn];
queue<int>q,q1;
vector<int>cg[maxn];
struct node{
    vector<int>edge[maxn];
    void add(int u,int v){
		edge[u].push_back(v);
	}
	void clear(int n){
		for(int i=1;i<=n;i++)
			edge[i].clear();
	}
}a,b,c,d;
void dfs(int x,int f){
    dfn[x]=++tot,id[tot]=x,ffa[x]=f,c.add(f,x);
    for(int i=0;i<a.edge[x].size();++i)
		if(!dfn[a.edge[x][i]])dfs(a.edge[x][i],x);
}
int find(int x){
    if(x==fa[x]) return x;
    int tmp=fa[x];fa[x]=find(fa[x]);
    if(dfn[semi[val[tmp]]]<dfn[semi[val[x]]]) val[x]=val[tmp];
    return fa[x];
}
int LCA(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    int d=dep[x]-dep[y];
    for(int i=20;i>=0;i--)
		if(d&(1<<i)) x=ff[i][x];
    for(int i=20;i>=0;i--)
		if(ff[i][x]^ff[i][y])
			x=ff[i][x],y=ff[i][y];
    return x==y?x:ff[0][x];
}
inline void tarjan(){
    for(int i=n;i>=2;--i){
        if(!id[i]) continue;
        int x=id[i],res=n;
        for(int j=0;j<b.edge[x].size();++j){
            int v=b.edge[x][j];
            if(!dfn[v]) continue;
            if(dfn[v]<dfn[x]) res=min(res,dfn[v]);
            else find(v),res=min(res,dfn[semi[val[v]]]);
        }
        semi[x]=id[res],fa[x]=ffa[x],c.add(semi[x],x);
    }
    for(int x=1;x<=n;x++)
		for(int i=0;i<c.edge[x].size();++i)
			du[c.edge[x][i]]++,cg[c.edge[x][i]].push_back(x);
    for(int x=1;x<=n;x++)
		if(!du[x]) q.push(x);
    while(!q.empty()){
        int x=q.front();q.pop();q1.push(x);
        for(int i=0;i<c.edge[x].size();++i)
			if(!--du[c.edge[x][i]]) q.push(c.edge[x][i]);
    }
    while(!q1.empty()){
        int x=q1.front(),f=0,len=cg[x].size();q1.pop();
        if(len) f=cg[x][0];
        for(int j=1;j<len;j++)
			f=LCA(f,cg[x][j]);
        ff[0][x]=f,dep[x]=dep[f]+1,d.add(f,x);
        for(int p=1;p<=20;p++)
			ff[p][x]=ff[p-1][ff[p-1][x]];
    }
}
int u[maxn],v[maxn];
int fid[maxn],ID,con[maxn];
void dfs2(int x){
	fid[x]=++ID;
	for(int y:d.edge[x])
		dfs2(y);
	con[x]=ID;
}
int mydep[maxn],myq[maxn],st,ed;
void mybfs(){
	myq[st=ed=1]=n;mydep[n]=1;
	while(st<=ed){
		int x=myq[st++];
		for(int y:a.edge[x])
			if(!mydep[y]){
				mydep[y]=mydep[x]+1;
				myq[++ed]=y;
			}
	}
}

int main()
{
	int T;read(T);while(T--){
		read(n);read(m);
		for(int i=1;i<=n;i++){
			fa[i]=val[i]=semi[i]=i;
			dfn[i]=id[i]=dep[i]=ffa[i]=du[i]=mydep[i]=0;
			cg[i].clear();
		}tot=0;
			
		for(int i=1;i<=m;i++){
			read(u[i]);read(v[i]);
			u[i]=n-u[i]+1;v[i]=n-v[i]+1;
			a.add(u[i],v[i]),b.add(v[i],u[i]);
		}
		// root: n
		dfs(n,0);tarjan();
		ID=0;dfs2(n);mybfs();
		bool ans=true;
		for(int i=1;i<=m;i++)
			if(mydep[u[i]]+1!=mydep[v[i]]){
				if(fid[u[i]]>=fid[v[i]]&&fid[u[i]]<=con[v[i]]);
				else {ans=false;break;}
			}
		puts(ans?"Yes":"No");
		a.clear(n);b.clear(n);c.clear(n);d.clear(n);
	}
}

G

当时一眼就想到了马拉车,但是没细想,开玩笑说了个是不是什么二维马拉车的神奇科技……

其实仔细考虑马拉车的话思路是很简单的,考虑每一行,枚举上下匹配对少列,然后直接跑马拉车,每次比较就是比较两段列,这个用哈希整一下就行。

代码晚点儿补……

H

n = 1 n=1 n=1 的时候特判一下, n = 2 n=2 n=2 的时候根据哥德巴赫猜想来整就行, n = 3 n=3 n=3 其实一样,先判断总和是否大于等于 2 n 2n 2n,是的话就一定可以,假设除了 1 , 2 1,2 1,2 位置全放 2 2 2,剩下的总和是偶数那么就成功了,如果不是偶数,那么就把三号位变成 3 3 3,总和就变成偶数了。

代码如下:

#include <bits/stdc++.h>
using namespace std;

bool prime(long long x){
	for(long long i=2;i*i<=x;i++)
		if(x%i==0)return false;
	return true;
}

int main()
{
	int n;long long sum=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		sum+=x;
	}
	if(sum<2*n)puts("No");
	else if(n==1){
		if(prime(sum))puts("Yes");
		else puts("No");
	}else if(n==2){
		if(sum&1){
			if(prime(sum-2))puts("Yes");
			else puts("No");
		}else puts("Yes");
	}else{
		puts("Yes");
	}
}

I

沿着路径走的过程肯定是贪心的,能不换颜色就不换颜色,但是每次要换什么颜色呢?只需要将这个点的颜色和后面的点取交集,尽可能往后走,直到交集为空。

于是问题变成了如何快速进行一条路径的贪心,其实这个贪心并不好拆成两段贪并且合并,所以考虑在lca处枚举一个颜色,然后看看这个颜色最多能往 x , y x,y x,y 处延伸到哪儿,比如 x x , y y xx,yy xx,yy,那么现在就拆成了 x → x x x \to xx xxx y → y y y\to yy yyy 的两段贪心。

一段子孙到祖先的贪心时很好求的,每个点向上二分一下找到最远能延伸到的点,然后倍增跳一下就求出步数了。

另外有个小优化,就是不用每次枚举之后都重新倍增跳,只需要一开始跳一次,跳到再跳一次就会跨过lca的位置就可以了,利用这个位置的深度和枚举即可求解。

时间复杂度 O ( 60 n log ⁡ n ) O(60n \log n) O(60nlogn),加上上面的优化时间复杂度其实也不变,但是由于常数可能有点儿大实在是过不去……

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define maxn 500010
#define inf 1000000
#define ll long long

#define cn getchar
template<class TY>void read(TY &x){
	x=0;int f1=1;char ch=cn();
	while(ch<'0'||ch>'9'){if(ch=='-')f1=-1;ch=cn();}
	while(ch>='0'&&ch<='9')x=x*10+(ch-'0'),ch=cn(); x*=f1;
}
template<class TY>void write2(TY x){
	if(x>9)write2(x/10);
	putchar(x%10+'0');
}
template<class TY>void write(TY x){
	if(x<0)putchar('-'),x=-x;
	write2(x);
}
int n,m;
ll c[maxn];
vector<int> to[maxn];
int sum[maxn][60];
int f[maxn][19],dep[maxn];
void dfs(int x){
	for(int i=0;i<60;i++)
		if(c[x]>>i&1)sum[x][i]++;
	for(int y:to[x]){
		if(y==f[x][0])continue;
		f[y][0]=x;
		for(int i=0;i<60;i++)
			sum[y][i]=sum[x][i];
		dep[y]=dep[x]+1;
		dfs(y);
	}
}
int fa[maxn][19];
void getfa(){
	for(int i=1;i<=n;i++){
		int x=i;
		for(int j=18;j>=0;j--){
			bool tf=false;
			for(int k=0;k<60;k++)
				if((c[f[x][j]]>>k&1) && sum[i][k]-sum[f[x][j]][k]==dep[i]-dep[f[x][j]])tf=true;
			if(tf)x=f[x][j];
		}
		fa[i][0]=x;
	}
	for(int j=1;j<19;j++)
		for(int i=1;i<=n;i++)
			fa[i][j]=fa[fa[i][j-1]][j-1];
}
int getlca(int x,int y){
	if(dep[x]>dep[y])swap(x,y);
	for(int i=18;i>=0;i--)
		if(dep[f[y][i]]>=dep[x])y=f[y][i];
	if(x==y)return x;
	for(int i=18;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int dis(int x,int y){
	if(dep[x]>dep[y])swap(x,y);
	int re=0;
	for(int i=18;i>=0;i--)
		if(dep[f[y][i]]>=dep[x])
			y=f[y][i],re+=(1<<i);
	if(x==y)return re;
	for(int i=18;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i],re+=(1<<i+1);
	return re+2;
}
struct par{
	int x,step;
};
par calc(int x,int y){
	if(x==y)return (par){y,0};
	int re=0;
	for(int i=18;i>=0;i--)
		if(dep[fa[y][i]]>dep[x])
			y=fa[y][i],re+=(1<<i);
	if(dep[fa[y][0]]<=dep[x])return (par){y,re+1};
	else return (par){y,inf};
}
int calc_ans(int x,int y){
	int lca=getlca(x,y);
	if(lca==x)return calc(x,y).step-1;
	if(lca==y)return calc(y,x).step-1;
	int re=inf;
	
	par xx=calc(lca,x),yy=calc(lca,y);
	if(xx.step==inf||yy.step==inf)return inf;
	for(int i=0;i<60;i++)
		if(c[lca]>>i&1){
			int tot=xx.step+yy.step;
			if(sum[xx.x][i]-sum[lca][i]==dep[xx.x]-dep[lca])tot--;
			if(sum[yy.x][i]-sum[lca][i]==dep[yy.x]-dep[lca])tot--;
			re=min(re,tot);
		}
	//优化前写法
	/*for(int i=0;i<60;i++)if(c[lca]>>i&1){
		int xx=x,yy=y;
		for(int j=18;j>=0;j--){
			if(dep[f[xx][j]]>=dep[lca] && sum[f[xx][j]][i]-sum[lca][i]<dep[f[xx][j]]-dep[lca])
				xx=f[xx][j];
			if(dep[f[yy][j]]>=dep[lca] && sum[f[yy][j]][i]-sum[lca][i]<dep[f[yy][j]]-dep[lca])
				yy=f[yy][j];
		}
		if(sum[xx][i]-sum[lca][i]<dep[xx]-dep[lca])xx=f[xx][0];
		if(sum[yy][i]-sum[lca][i]<dep[yy]-dep[lca])yy=f[yy][0];
		re=min(re,calc(xx,x)+calc(yy,y));
	}*/
	
	return re;
}

int main()
{
	read(n);read(m);
	for(int i=1;i<=n;i++)read(c[i]);
	for(int i=1,x,y;i<n;i++){
		read(x);read(y);
		to[x].push_back(y);
		to[y].push_back(x);
	}
	dep[1]=1;dfs(1);
	for(int j=1;j<19;j++)
		for(int i=1;i<=n;i++)
			f[i][j]=f[f[i][j-1]][j-1];
	getfa();
	for(int i=1;i<=m;i++){
		int x,y;read(x);read(y);
		int ans=calc_ans(x,y)+dis(x,y);
		if(ans>=inf)puts("-1");
		else write(ans),puts("");
	}
}

J

题意一开始还没看懂……就是要找几个 1 1 1 ~ n n n 的排列,使得给出的每个偏序关系都在某个排列中存在。

其实最多只需要两个,如果整一个 1 1 1 ~ n n n 再整个 n n n ~ 1 1 1 那么所有偏序关系都有了。

那么就是要判断一下能不能一个排列整完,将偏序关系连边跑一个拓扑就行,有环就是需要两个排列,否则拓扑序就是答案。

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000010

struct edge{int y,next;}e[maxn];
int first[maxn],et=0;
void buildroad(int x,int y){
	e[++et]=(edge){y,first[x]};
	first[x]=et;
}

int main()
{
	int n,m;cin>>n>>m;
	vector<int> du(n+1);
	for(int i=1;i<=m;i++){
		int x,y;cin>>x>>y;
		buildroad(x,y);
		du[y]++;
	}
	vector<int> sta,ans;
	for(int i=1;i<=n;i++)
		if(!du[i])sta.push_back(i);
	while(sta.size()){
		int x=sta.back();sta.pop_back();
		ans.push_back(x);
		for(int i=first[x];i;i=e[i].next){
			int y=e[i].y;du[y]--;
			if(!du[y])sta.push_back(y);
		}
	}
	if(ans.size()==n){
		cout<<"1\n";
		for(auto i:ans)
		cout<<i<<' ';
	}else{
		cout<<"2\n";
		for(int i=1;i<=n;i++)
			cout<<i<<' ';
		cout<<"\n";
		for(int i=n;i>=1;i--)
			cout<<i<<' ';
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023牛客暑期多校第三场部分题解 的相关文章

随机推荐

  • 记录一linux命令:xargs

    转自 http www sudu cn info html edu linux 20080102 290238 html xargs 大多数 Linux 命令都会产生输出 文件列表 字符串列表等 但如果要使用其他某个命令并将前一个命令的输出
  • 关于数据表空间问题总结

    oracle经常需要查数据库表空间大小 使用率 加表空间等 这里总结我经常使用的语句 一 数据表空间相关 查询所有表空间的使用情况 SELECT d tablespace name Name d status Status TO CHAR
  • 姓名编码查询

    内容较多 查找时请使用 ctrl F 组合键查找 本汉字代码表摘自 字符集和信息编码 国家标准汇编 中国标准出版社 1998年编 谢绝负责法 律责任 啊 1601 阿 1602 吖 6325 嗄 6436 腌 7571 锕 7925 埃 1
  • 测试如何转开发系列(四)

    囫囵吞枣法 是快速学习的核心方法 用最快的时间 把最主要知识点都学会 学习的第一步 选资料一定选择书籍 纸质的和电子书最合适 因为书籍相对内容更系统 而且内容更丰富 要选择基础入门的书籍 不要选择深入研究这种的 一深入就出不来了 深入就代表
  • 利用Vulnhub复现漏洞 - Jenkins-CI 远程代码执行漏洞(CVE-2017-1000353)

    Jenkins CI 远程代码执行漏洞 CVE 2017 1000353 Vulnhub官方复现教程 漏洞原理 复现过程 启动环境 漏洞复现 生成序列化字符串 发送数据包 执行命令 检验 Vulnhub官方复现教程 https vulhub
  • 【数据库】PostgreSQL增加密码复杂度校验

    前言 最近修改问题单 被分配了一个增加密码复杂度校验的单子 PG库也不是很懂 查了资料 PG有自带的密码复杂度校验插件 只需要使用这个插件就可以了 然后根据这几天的折腾 总结一下 怎么添加密码复杂度校验插件 PostgreSQL可以使用pa
  • 云计算与大数据第11章 大数据隐私保护习题带答案

    第11章 大数据隐私保护习题 11 1 选择题 1 以下 D 通常不是导致数据隐私泄露问题的来源 A 数据被肆意收集 B 数据集成融合 C 大数据分析 D DDOS攻击 2 以下 C 不是数据隐私保护的主要目标 A 机密性 B 完整性 C
  • 第38步 深度学习图像识别:VGG19建模(Tensorflow)

    基于WIN10的64位系统演示 一 写在前面 1 预训练模型和迁移学习 预训练模型就像是一个精心制作的省力工具 它是在大量的数据上进行训练 然后将学习到的模型参数保存下来 然后 我们可以直接使用这些参数 而不需要从头开始训练模型 这样可以节
  • PyTorch基础练习-task7(用PyTorch完成手写数字识别)

    PyTorch基础练习 task7 task7 import torch import numpy as np from torch autograd import Variable import torch nn as nn import
  • Vue全局注册组件的几种方式

    Vue全局注册组件的几种方式 1 extend vue js 代码 var com Vue extend template h1 这是第一种方式 h1 Vue component MyComponent com 此时的组件名为 MyComp
  • MySQL数据备份和恢复

    MySQL数据备份和恢复 数据备份 mysqldump是MySQL数据库备份工具 可以备份MySQL数据库中的数据和结构 生成 sql文件 方便数据的迁移和恢复 使用mysqldump工具前一定要配置环境变量 打开开始菜单 搜索 环境变量
  • 谷歌gn编译文件的使用简介

    Gn是什么 它是Google用来维护chromium项目的编译工具 现在相关的开源项目都基于gn来进行编译管理 目前一些大型系统的都会使用gn 例如谷歌 鸿蒙 Gn就是一个构建脚本生成器 是之前gyp的升级版本 并且gn是基于c 编写 效率
  • Python论文绘图利器seaborn.lineplot

    Python论文绘图利器seaborn lineplot 提示 前言 Python论文绘图利器seaborn lineplot 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 Python论文绘图利器seabor
  • Java中的equals()方法

    equals 在哪里 首先我们知道Java中Object类是所有类的父类 它里面定义了equals 方法 public boolean equals Object obj return this obj 可以看到是使用 来进行比较的 那么
  • 20 个常用的 CSS 技巧

    Sandy 推荐 高级工程师 游戏开发 下面这几个CSS技巧你可能不知道 1 彩色照片变黑白 2 所有元素垂直居中 3 禁用鼠标 4 模糊文字 小编学完能量满满的 觉得对CSS又充满了爱 你也来看看 原文链接 http caibaojian
  • sql 关联了2张表的 update 语句(转)

    转自 SQL Update 使用一个表的数据更新另一张表 update 关联两个表 基本上 select 能支持的关联和子查询操作 都能在 update 语句中使用 在 where 条件中使用子查询 update a set a age 1
  • Spark WARN cluster.ClusterScheduler: Initial job has not accepted any resources;check your cluster

    当我在Spark集群模式执行以下命令时 root debian master home hadoop spark 0 8 0 incubating bin hadoop1 run example org apache spark examp
  • DBA成长随笔---Oracle 11g,性能优化之等待事件

    目录 等待的定位方式 等待事件分类 观察等待事件的视图 常见等待事件 等待事件主要可以分为两类 即空闲 IDLE 等待事件和非空闲 NON IDLE 等待事件 空闲等待事件 是指Oracle正等待某种工作 比如用sqlplus登录之后 但没
  • 远程桌面连接出现了内部错误怎么解决?

    远程桌面连接是一种非常方便的工具 可以让用户从远程访问其他计算机的桌面界面 但是 有时候在连接远程桌面时会出现内部错误 导致无法连接或者连接后无法正常使用 在本文中 我们将会讨论远程桌面连接出现内部错误的原因和解决方法 1 确认网络连接 在
  • 2023牛客暑期多校第三场部分题解

    索引 A B D E G H I J A 直接输出两个数的差即可 再判一下无解的情况 B 其实思路还挺顺的 首先拿的牌肯定是一段增一段减一段增一段减 的序列 并且 gt n gt n gt n 的开头和 n