Codeforces Round #766 (Div. 2)(补)

A . if else 即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6+10,M=1e6+10;
int s[N];
void solve(){
	bool ok=0;char a[50][50];
	int n,m,r,c;cin>>n>>m>>r>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='B')ok=1;
		}
	} 
	if(ok==0){
		cout<<-1<<'\n';return ;
	}
	if(a[r][c]=='B'){
		cout<<0<<'\n';return ;
	}
	for(int i=1;i<=n;i++)if(a[i][c]=='B'){
		cout<<1<<'\n';return ;
	}
	for(int i=1;i<=m;i++)if(a[r][i]=='B'){
		cout<<1<<'\n';return ;
	}
	cout<<2<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
	int t;cin>>t;
	//int t=1;
	while(t--){
		solve();
	}
} 

B. 一定是四个节点 取max即可 注意输出

#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define mkp make_pair
const int INF=0x3f3f3f3f;
const int N=1e5,M=1e6+10;
int mhd(int x1,int x2,int y1,int y2){
	return abs(x1-x2)+abs(y1-y2);
}

void solve(){
	int n,m;cin>>n>>m;int maxx=0;
	int ans[n+m]={0};
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans[max({mhd(1,i,1,j),mhd(n,i,m,j),mhd(1,i,m,j),mhd(n,i,1,j)})]++;
		}
	}
	for(int i=0;i<n+m;i++){
		for(int j=1;j<=ans[i];j++){
			cout<<i<<" ";
		} 
	}
	cout<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
	int t;cin>>t;
	//int t=1;
	while(t--){
		solve();
	}
} 

C. 质数加上质数等于质数 所以一个点最多连两个点 这样他就变成一条链 遍历走一遍链2 3 2 3 即可

注意遍历链和构建链即可

#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
#define mkp make_pair
const int INF=0x3f3f3f3f;
const int N=1e5,M=1e6+10;


void solve(){
	bool ok=0;
	int n;cin>>n;
	map<pair<int,int>,int> mp;
    vector<int> v[n+1];
    int ans[n+1]; 
	for(int i=1;i<=n-1;i++){
		int x,y;cin>>x>>y;
		v[x].pb(y);v[y].pb(x);
		mp[mkp(x,y)]=i;mp[mkp(y,x)]=i;
		if(v[x].size()>2||v[y].size()>2)ok=1;
	} 
	if(ok){
		cout<<-1<<'\n';return ;
	}
	function<void(int,int,int)>dfs=[&](int now,int fa,int val){
	for(auto it: v[now]){
		if(it==fa)continue;
		val=5-val;
		ans[mp[mkp(now,it)]]=val;
		dfs(it,now,val);
     	}
    };
	dfs(1,1,2);
	for(int i=1;i<n;i++)cout<<ans[i]<<" ";
	cout<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
	int t;cin>>t;
	//int t=1;
	while(t--){
		solve();
	}
} 

D. 题意就是找到gcd 这个数组中的数的gcd 但是数组内不存在

因为是1e6所以我们暴力肯定超时 但是可以想想 我们可以暴力倍数 因为多出来的数肯定是原数组中某个数的倍数 我们就枚举倍数 因为gcd 只能小不能大 所以我们只需要递推出 是否满足每一个遍历的i 的倍数 如果最后的gcd 等于 i 那么就会cnt++;具体看代码 如果这个数i原数组出现过就跳过 如果没出现过 我们就暴力他的倍数 如果他的倍数最后gcd出它本身 就证明它可以出现在数组中就cnt++;

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
	int n;cin>>n;
	int ans[N+1]={0},cnt=0;int x;
	for(int i=1;i<=n;i++)cin>>x,ans[x]=1;
	for(int i=1;i<=N;i++){
		if(ans[i]==1)continue;
		long long t=0;
		for(int j=i;j<=N;j+=i)if(ans[j])t=__gcd(t,j);
		if(t==i)cnt++;
	}
	cout<<cnt<<'\n';
}
signed main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
	//int t;cin>>t;
	int t=1;
	while(t--){
		solve();
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值