【AtCoder ABC 131】补题AK

比赛链接

A 模拟 语法

思路 遍历判断前后是否相同即可
代码
#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 ok = 1;
string s;
int main() {
	cin >> s;

	forn(i, 1, s.size() - 1) {
		if (s[i] == s[i - 1]) ok = 0;
	}

	if (ok) cout << "Good";
	else cout << "Bad";
	return 0;
}

B 枚举

思路 求出总和sum,然后对于每一个i一个一个判断,并不断更新答案
代码
#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, l;
int ans, sum, mi = inf;
int main() {
	cin >> n >> l;

	forn(i, 1, n) sum += l + i - 1;
	forn(i, 1, n) {
		if (abs(l + i - 1) < mi) {
			mi = abs(l + i - 1);
			ans = sum - (l + i - 1);
		}
	}

	cout << ans;
	return 0;
}

C 数学 容斥

思路

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

ll a, b, c, d;
ll ans;
ll cnt(ll x) {
	ll l = a / x, r = b / x;
	return r - l + (a % x == 0);
}
int main() {
	cin >> a >> b >> c >> d;

	ll len = b - a + 1;
	ll num_c = cnt(c);
	ll num_d = cnt(d);
	ll num_cd = cnt(c * d / __gcd(c, d));

	ans = len - num_c - num_d + num_cd;
	cout << ans;
	return 0;
}

D 贪心

思路 由于我们要完成所有任务,所以要尽可能的让结束时间早的先完成,所以我们先按照结束时间从小到大排序,这样我们就尽可能的完成任务。

在遍历判断就很简单了

代码
#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;

struct node {
	ll a, b;
} s[N];
bool cmp(node x, node y) {
	if (x.b == y.b) return x.a < y.a;
	return x.b < y.b;
}
int n;
int ok = 1;
int main() {
	cin >> n;
	forn(i, 1, n) cin >> s[i].a >> s[i].b;

	sort(s + 1, s + n + 1, cmp);
	ll res = 0;
	forn(i, 1, n) {
		res += s[i].a;
		if (s[i].b < res) ok = 0;
	}

	if (ok) cy;
	else cn;
	return 0;
}

E 构造 思维

思路

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

ll n, k, m;
int main() {
	cin >> n >> k;
	m = (n - 1) * (n - 2) / 2;
	if (k > m) {
		cout << -1;
		return 0;
	}

	ll cnt = n - 1 + m - k;
	cout << cnt << endl;
	forn(i, 2, n) cout << 1 << ' ' << i << endl;
	if (cnt == n - 1) return 0;
	forn(i, 2, n) {
		forn(j, i + 1, n) {
			cout << i << ' ' << j << endl;
			if (--cnt == n - 1) return 0;
		}
	}
	return 0;
}

F 思维 并查集

思路

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;

class DSU {
public:
	void init(int n) {
		size = n;
		p.resize(size + 1);
		forn(i, 1, size) p[i] = i;
	}
	int find(int x) {
		if (p[x] != x) p[x] = find(p[x]);
		return p[x];
	}
	void merge(int x, int y) {
		p[find(x)] = find(y);
	}

private:
	vector<int> p;
	int size;
};

int n;
int x, y;
DSU f;
ll r[N], c[N];
ll ans;
int main() {
	f.init(2e5);
	cin >> n;
	forn(i, 1, n) {
		cin >> x >> y;
		f.merge(x, y + 1e5);
	}

	forn(i, 1, 1e5) r[f.find(i)]++;
	forn(i, 1e5 + 1, 2e5) c[f.find(i)]++;

	forn(i, 1, 2e5) ans += r[i] * c[i];
	cout << ans - n;
	return 0;
}
posted @ 2023-12-08 10:31  史上最速败犬  阅读(16)  评论(0)    收藏  举报