【AtCoder ABC 126】补题AK

比赛链接

A 语法 01:44

思路 大小写转换
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;

int n, k;
char s[N];
int main() {
	cin >> n >> k;
	forn(i, 1, n) cin >> s[i];

	s[k] = s[k] - 'A' + 'a';

	forn(i, 1, n) cout << s[i];
	return 0;
}

B 语法 03:35

思路 截取成两个整数,然后按题意判断就行了
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;

string s;
string x, y;
int main() {
	cin >> s;

	x = s.substr(0, 2), y = s.substr(2, 2);
	int a = stoi(x), b = stoi(y);

	int ok1 = (a >= 1 && a <= 12);
	int ok2 = (b >= 1 && b <= 12);
	if (ok1 && ok2) cout << "AMBIGUOUS";
	else if (ok1) cout << "MMYY";
	else if (ok2) cout << "YYMM";
	else cout << "NA";
	return 0;
}

C 概率论 12:28

思路 对于每种点数,直接算期望,然后累加起来就行了
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;

double n, k;
double ans;
double op(double x) {
	double res = 1 / n;
	while (x < k) {
		x *= 2.0;
		res /= 2.0;
	}
	return res;
}
int main() {
	cin >> n >> k;

	forn(i, 1, n) ans += op(i);

	printf("%.12lf", ans);
	return 0;
}

D 构造 搜索 20:33

思路 题目说了,保证能构造出来,那我直接把1设为根,与根相距距离为偶数的就涂一种颜色,是奇数就涂另外一种 突然发现好玄学啊,但是确实能过
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 5;

struct node {
	int ne, w;
};
int n;
int ans[N];
vector<node> g[N];
void dfs(int u, int f, int sum) {
	if (sum & 1) ans[u] = 1;
	for (auto v : g[u]) {
		if (v.ne == f) continue;
		dfs(v.ne, u, sum + v.w);
	}
}
int main() {
	cin >> n;
	forn(i, 1, n - 1) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back({v, w & 1});
		g[v].push_back({u, w & 1});
	}

	dfs(1, 0, 0);

	forn(i, 1, n) cout << ans[i] << endl;
	return 0;
}

E 思维 并查集 11:56

思路 一开始纸上画来画去,还分类讨论什么的,因为数列只有1和2,确定一个其他的就出来了(推广到多个数也是一样),仔细一想,这不就是并查集嘛,最后输出连通块个数即可
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 5;

struct node {
	int ne, w;
};
int n;
int ans[N];
vector<node> g[N];
void dfs(int u, int f, int sum) {
	if (sum & 1) ans[u] = 1;
	for (auto v : g[u]) {
		if (v.ne == f) continue;
		dfs(v.ne, u, sum + v.w);
	}
}
int main() {
	cin >> n;
	forn(i, 1, n - 1) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back({v, w});
		g[v].push_back({u, w});
	}

	dfs(1, 0, 0);

	forn(i, 1, n) cout << ans[i] << endl;
	return 0;
}

F 构造 44:33

思路 懒得敲了,然后注意特判

image

代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "Yes" << endl
#define cn cout << "No" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;

int n, m, k;
int a[N];
int main() {
	cin >> n >> k;
	m = pow(2, n);
	if (n == 1 && k == 0) {
		cout << "0 0 1 1";
		return 0;
	}
	if (k >= m || (n == 1 && k == 1)) {
		cout << -1 << endl;
		return 0;
	}
	forn(i, 1, m) {
		if (i - 1 == k) continue;
		cout << i - 1 << ' ';
	}
	cout << k << ' ';
	forn_(i, m, 1) {
		if (i - 1 == k) continue;
		cout << i - 1 << ' ';
	}
	cout << k << ' ';
	return 0;
}

posted @ 2023-12-01 20:52  史上最速败犬  阅读(14)  评论(0)    收藏  举报