AtCoder Beginner Contest 292-C D E F

C.Four Variables

从正整数中,找出合适的ABCD,使得这个式子成立\(AB+CD=N\)
可以看到,A与B是相互关联的,C与D是相互关联的,所以我们可以在小于N的正整数中,找寻可以相加的两个数,并且这两个数都可以分别表示为两个整数相乘,分别统计,同时注意AB的无序性即可。
下见代码:

//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
	ll 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;
}

using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;

void solve(){
	ll n,x,y,ans=0,cnta,cntc;
	cin>>n;
	for(ll i=1;i<n;++i){
		x=i;y=n-i;
		cnta=cntc=0;
		for(ll j=1;j*j<=x;++j){
			if(x%j==0){
				++cnta;
				if(x!=j*j) ++cnta;
			}
		}
		for(ll j=1;j*j<=y;++j){
			if(y%j==0){
				++cntc;
				if(y!=j*j) ++cntc;
			}
		}
		ans+=cnta*cntc;
	}
	cout<<ans<<"\n";
	return ;
}

signed main(){
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

D.Unicyclic Components

给一个无向图,判断所有的连通分支,是否都满足定点数等于边数。
利用并查集判断连通性,同时统计各连通分支是否满足条件即可。
下见代码:

//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
	ll 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;
}

using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
int n,m,fa[maxm],cntm[maxm];

void pre(){
	for(int i=0;i<n;++i)
		fa[i]=i;
	return ;
}

int findfa(int t){
	if(fa[t]==t) return t;
	else return fa[t]=findfa(fa[t]);
}

void solve(){
	int y,a,b;
	cin>>n>>m;
	pre();
	for(int i=0;i<m;++i){
		cin>>cntm[i]>>y;
		a=findfa(cntm[i]-1);
		b=findfa(y-1);
		if(a!=b){
			fa[a]=b;
		}
	}
	if(n!=m){
//		cout<<".1..\n";
		cout<<"No\n";
		return ;
	}
	vector<int> d(n,0),e(n,0);
	for(int i=0;i<n;++i){
		++d[findfa(i)];
	}
	for(int i=0;i<m;++i){
		++e[findfa(cntm[i]-1)];
	}
	if(d==e) cout<<"Yes\n";
	else cout<<"No\n";
	return ;
}

signed main(){
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

E.Transitivity

题意是构造给定关系的传递闭包,就是将给定有向图的a->b,b->c但无a->c的补充一条有向边,使得对于任意不同的abc都有这个成立。怎么说呢,如果去模拟上面所说过程,那么时间复杂度不能满足题目的要求。其实题目根本的意思就是,对于一个顶点a,与其连通的所有顶点,a都有一条边与其相连,所以我们可以用BFS/DFS来求解。
构造图的传递性
下见代码:

//>>>Qiansui
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
	ll 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;
}

using namespace std;
const int maxm=2e3+5,inf=0x3f3f3f3f,mod=998244353;
int n,m;

void solve(){
	cin>>n>>m;
	ll u,v,ans=0,t;
	vector<int> map[n+1];
	for(int i=0;i<m;++i){
		cin>>u>>v;
		map[u].push_back(v);
	}
	queue<int> q;
	for(int i=1;i<=n;++i){//vertices
		vector<int> vis(n+1,0);
		vis[i]=1;
		q.push(i);
		while(!q.empty()){
			t=q.front();
			q.pop();
			vis[t]=1;
			for(int j=0;j<map[t].size();++j){
				u=map[t][j];
				if(vis[u]) continue;
				vis[u]=1;
				q.push(u);
				++ans;
			}
		}
	}
	cout<<ans-m<<'\n';
	return ;
}

signed main(){
//	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int _=1;
//	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

F.Regular Triangle Inside a Rectangle

数学题...
求一个矩形里面的最大正三角形
官方题解:Editorial

posted on 2023-03-07 22:46  Qiansui  阅读(25)  评论(0编辑  收藏  举报