TOYOTA SYSTEMS Programming Contest 2024(AtCoder Beginner Contest 377) 補題記錄(A-E)

ZhangDT發表於2024-11-01

AtCoder Beginner Contest 377

A - Rearranging ABC

字串有ABC三個字母即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
	string s;
	cin >> s;
	map<char, int> mp;
	for (auto t : s) {
		mp[t] = 1;
	}
	if (mp['A'] == 1 && mp['B'] == 1 && mp['C'] == 1) cout << "Yes\n";
	else cout << "No\n";
}

B - Avoid Rook Attack

標記一下哪行哪列不可以放,然後暴力列舉

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
	char a[10][10];
	map<int, int> h, l;
	for (int i = 1; i <= 8; i++)
		for (int j = 1; j <= 8; j++) {
			cin >> a[i][j];
			if (a[i][j] == '#') h[i] = 1, l[j] = 1;
		}
	int cnt = 0;
	for (int i = 1; i <= 8; i++) {
		for (int j = 1; j <= 8; j++) {
			if (a[i][j] == '.') {
				if (h[i] == 0 && l[j] == 0) cnt++;
			}
		}
	}
	cout << cnt << '\n';
}

C - Avoid Knight Attack

\(set\)套一個\(pair\)將所有能吃的點和有馬的點存入\(set\),能放的點就是剩下的點。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
	int n, m;
	cin >> n >> m;
	set<pair<int, int>> se;
	int dx[10] = {-1, -2, -2, -1, 1, 2, 2, 1};
	int dy[10] = {-2, -1, 1, 2, 2, 1, -1, -2};
	while (m--) {
		int x, y;
		cin >> x >> y;
		se.insert({x, y});
		for (int i = 0; i < 8; i++) {
			if (x + dx[i] >= 1 && x + dx[i] <= n && y + dy[i] >= 1 && y + dy[i] <= n)
				se.insert({x + dx[i], y + dy[i]});
		}
	}
	cout << n*n - se.size() << '\n';
	
}

D - Many Segments 2

首先考慮加法不好做,於是我們選擇減法減去所有不合法的區間,那麼剩下的就是我們需要的答案。
透過模擬和思考發現我們可以列舉每一個位置 \(i\)查詢離這個位置右側最近的區間左邊界\(r\),同時這個區間右邊界\(l\)需要大於等於\(i\)此時可以刪除(\(i\)\([r,m]\))這些區間組合。

為了實現我們的需求,我們可以對區間按照\(r\)排序,使用雙指標查詢合法可刪除區間。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
struct node {
	int l, r;
} a[N];
bool cmp(node x, node y) {
	if (x.r != y.r) return x.r < y.r;
	return x.l < y.l;
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].l >> a[i].r;
	}
	sort(a + 1, a + 1 + n, cmp);
	int j = 1;
	int ans = m + m * (m - 1) / 2;
	for (int i = 1; i <= m; i++) {
		int x = i;
		while (a[j].l < x && j < n) j++;
		if (a[j].l < x) ans -= 0;
		else ans -= (m - a[j].r + 1);
	}
	cout << ans << '\n';
}

E - Permute K times 2

相關文章