首页 > 其他分享 >AtCoder Beginner Contest 292-C D E

AtCoder Beginner Contest 292-C D E

时间:2023-03-07 22:58:31浏览次数:46  
标签:AtCoder ch Beginner ll long while include 292 define

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;
}

标签:AtCoder,ch,Beginner,ll,long,while,include,292,define
From: https://www.cnblogs.com/Qiansui/p/17190023.html

相关文章

  • ABC 292 ABCD
    https://atcoder.jp/contests/abc292/tasks来水一篇题解嘻嘻......
  • Atcoder-ABC291 "Teleporter and Closed off" 动态DP版
    题目地址题意:在一个DAG图中,点i只有最多m条出边连向i+1~i+m(m<=10),边权均为1。对于\(k\in[2,n-1]\),依次输出当点k被删除时1到n的最短路。分析:标准做法无非就是预......
  • 容斥定理 AtCoder——FizzBuzz Sum Hard
    题目传送门ProblemStatementFindthesumofintegersbetween 1 and N(inclusive)thatarenotmultiplesof Aor B.Constraints1≤N,A,B≤109 Allvalue......
  • AtCoder Beginner Contest 292
    A-CAPSLOCK#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){strings;cin>>s;for(autoi:s)cout<<char(i-'a'+......
  • AtCoder Beginner Contest 292
    《E-Transitivity》   这道题首先要看一下自己有没有理解错题意:      问:点2和点3之间要连边吗? 答案是不需......
  • AtCoder Regular Contest 131(A,B,C)
    AtCoderRegularContest131(A,B,C)AA这个大意就是很容易做出来,只是有一点要注意,对于第二个字符串,如果小于\(2\),那么比如\(1\),,这些可能是进位形成的,所以我们需要补一......
  • 题解:【ABC292F】 Regular Triangle Inside a Rectangle
    题目链接不妨设\(a\leb\)。显然当三角形三个点都在矩形边上的时候可以得到答案。通过手玩我们可以发现,当正方形推广到矩形的过程中,我们将一边拉长,三角形就可以不断往......
  • ABC292解题报告
    比赛传送门E.Transitivity题意:有一张有向图,你需要在其中添加若干条边,满足对于任意\(a\tob,b\toc\),都有\(a\toc\)。求最少的添加边数。\(n,m\le2000\)。首先可......
  • AtCoder Beginner Contest 292
    A-CAPSLOCK(abc292a)题目大意给定一个小写字母串,将其转换成大写字母。解题思路调库,或者按照ascii码转换即可。神奇的代码#include<bits/stdc++.h>usingname......
  • AtCoder Beginner Contest 252
    AtCoderBeginnerContest252D题意在数组中形如\(1\leqi<j<k\leqn\)使得\(a_i,a_j,a_k\)互不相同,求共有多少组满足条件思路它的数据范围\(1\leqa_i\leq2*10^5\)......