首页 > 其他分享 >AtCoder Beginner Contest 049

AtCoder Beginner Contest 049

时间:2024-08-24 17:52:52浏览次数:15  
标签:AtCoder Beginner int cin ++ 049 rm using find

A - UOIAUAI

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	char c;
	cin >> c;
	if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') cout << "vowel";
	else cout << "consonant";
	return 0;
}

B - Thin

观察样例发现规律后直接模拟。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int H, W;
	cin >> H >> W;
	vector<char> v(W);
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			cin >> v[j];
			cout << v[j];
		}
		cout << "\n";
		for (int j = 0; j < W; j++) cout << v[j];
		cout << "\n";
	}
	return 0;
}

D - Connectivity

道路涉及连通性的问题,即同一道路相互连接的各条道路之间都可相互通行,因此可以使用两个并查集,一个记录道路,一个记录铁路。

不管是道路还是铁路,对于每个城市来说一定与其连通的肯定是它在该并查集的祖先,(城市在该并查集中有祖先即说明该城市在并查集中)

一开始想数组 \(f[i][j]\) 表示与 \(i\) 和 \(j\) 分别连通的城市个数,那么对于城市 \(u\),答案即为 \(\rm f[find(u,p_1)][find(u,p_2)]\)。初始化过程就是遍历每一个城市,\(\rm f[find(i,p_1)][find(i,p_2)]\)++。

发现空间复杂度为 \(O(n^2)\) ,舍弃。

image

观察到,对于每个点,我们只会把这个数组的一个位置+1,所以至多用到 \(N\) 个位置。可以开 \(\rm map\)<\(\rm pair\)<\(\rm int,int\)>\(\rm,int\)>,将 \((x,y)\) 当成坐标映射,即可实现空间复杂度 \(O(n)\)。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int p1[200005], p2[200005];

int find(int x, int* p) {
	if (x != p[x]) return p[x] = find(p[x], p);
	return p[x];
} 

void merge(int x, int y, int* p) {
	p[find(x, p)] = find(y, p);	
}

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N, K, L;
	cin >> N >> K >> L;
	for (int i = 1; i <= N; i++) {
		p1[i] = i;
		p2[i] = i;
	}
	
	for (int i = 1; i <= K; i++) {
		int a, b;
		cin >> a >> b;
		merge(a, b, p1);
	}
	for (int i = 1; i <= L; i++) {
		int c, d;
		cin >> c >> d;
		merge(c, d, p2);
	}
	
	map<pair<int, int>, int> ans;
	for (int i = 1; i <= N; i++) {
		ans[{find(i, p1), find(i, p2)}]++;
	}
	for (int i = 1; i <= N; i++) cout << ans[{find(i, p1), find(i, p2)}] << " ";
	return 0;
}

\(\rm plus:\) 可以使用 \(\rm AtCoder\) 自己的并查集板子:

#include<bits/stdc++.h>
#include<atcoder/dsu>

using namespace std;
using namespace atcoder; 

int main() {
    int N, K, L; 
    cin >> N >> K >> L;
    dsu uf1(N), uf2(N);
    for (int i = 0; i < K; i++) {
        int p, q; 
        cin >> p >> q; 
        p--, q--; 
        uf1.merge(p,q);
    }
    for (int i = 0; i < L; i++) {
    	int l, r; 
    	cin >> l >> r; 
    	l--, r--; 
    	uf2.merge(l,r);
    }
    map<pair<int, int>, int> m;
    for (int i = 0; i < N; i++) m[{uf1.leader(i),uf2.leader(i)}]++;
    for (int i = 0; i < N; i++) cout << m[{uf1.leader(i),uf2.leader(i)}] << " ";
    return 0;
}

标签:AtCoder,Beginner,int,cin,++,049,rm,using,find
From: https://www.cnblogs.com/pangyou3s/p/18378008

相关文章

  • AtCoder Beginner Contest 367 A ~ F(无D题)题解
    AtCoderBeginnerContest367A~F(̸\notD)几天前就已经vp过了,但是忘写题解了今天才想起来痛,早知道这么简单,我就不在家里摆烂了A.ShoutEveryday罚了好几发,我打比......
  • AtCoder Beginner Contest 358
    C-Popcorn思路:从集合S中选出非空子集,使得子集中糖果口味有M种。观察到集合S中的元素数量n<=10。因此,总共的子集数为C<=2^10-1,考虑枚举所有的子集。代码:#include<bits/stdc++.h>#defineintlonglong#defineullunsignedlonglong#defineiosios::sync_with_s......
  • 049、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入emitter用于全局事件总线importemitterfrom'@/utils/emitter'constapp=createApp(App);//App.vue的根元素id为app......
  • AtCoder Beginner Contest 050
    基本上独立做出来了。A-AdditionandSubtractionEasy模拟。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intA,B; charC; cin>>A>>C>>B; if(C==......
  • AtCoder Beginner Contest 中的小思维题
    078Dhttps://atcoder.jp/contests/abc078/tasks/arc085_b问题陈述我们有一副由\(N\)张牌组成的扑克牌。每张牌上都写着一个整数。从最上面开始的第\(i\)张牌上的整数是\(a_i\)。两个人X和Y将用这副扑克牌玩一个游戏。最初,X手中有一张写有\(Z\)的牌,Y手中有一张......
  • AtCoder Beginner Contest 048
    A-AtCoder***Contest先输出首字母,然后遍历字符串,遇到空格就输出后面的第一个字符。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); strings; getline(cin,s); cout<<s[0];......
  • Atcoder Beginner Contest 365
    AtcoderBeginnerContest365A题意输入年份,输出该年份天数。思路略B题意输入一个序列,输出该序列次大值的位置。思路略C题意给定\(N\),序列\(A\)和\(M\)。求满足下条件的\(x\)最大值。\[\sum_{i=1}^{n}\min(x,A_i)\leM\]思路式子左边有单调性,二分\(x\)......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies简单排序。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); vector<int>a(3); cin>>a[0]>>a[1]>>a[2]; sort(a.begi......
  • AtCoder Beginner Contest 367
    A-ShoutEveryday思路:水题一道,模拟即可。B-Cut.0思路:直接cin和cout即可,c++输入输出性质。C-EnumerateSequences思路:注意到数据范围很小,因此考虑到搜素所有的序列,然后判断是否合法。D-Pedometer思路:观察到是环上问题,先断环为链,观察题目,可以发现,对于s,它的终......
  • AtCoder Beginner Contest 046
    A-AtCoDeerandPaintCans#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); set<int>s; for(inti=0;i<3;i++){ intx; cin>>x; s.inser......