总述:这场ABC难度没有之前的大,而且后面的G是典,成功完成人生首次ak ABC,特写一篇题解留念
A - Past ABCs
可以用字符串的substr函数截取后三位,再用stoi()把字符串转数字,判断这个数字在不在范围内,以及不等于316即可
代码:
#include <bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define ll long long
#define pii pair<int, int>
#define db double
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 998244353;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
string str;
cin >> str;
string a = str.substr(0, 3);
string b = str.substr(3);
int num = stoi(b);
if (1 <= num && num <= 349 && num != 316) {
cout << "Yes" << endl;
} else
cout << "No" << endl;
// system("pause");
return 0;
}
B - Dentist Aoki
模拟,直接用01数组表示是否存在牙齿,每次操作可以用异或1来表示取反,最后统计数组内有几个1
代码:
#include <bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define ll long long
#define pii pair<int, int>
#define db double
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 998244353;
int arr[maxn];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++)
arr[i] = 1;
while (q--) {
int x;
cin >> x;
arr[x] ^= 1;
}
int ans = 0;
for (int i = 1; i <= n; i++)
ans += arr[i];
cout << ans << endl;
// system("pause");
return 0;
}
C - Sort
置换环,有两种写法
1.
对于错位的元素,可以将应该在该位置的元素调换过来,这种写法就需要两个数组互相映射,比较绕,不推荐写这种。
2.
对于错位的元素,可以选择将该元素替换至它应该在的地方,每次替换都至少能让一个元素归位,所以最多也是 n − 1 n-1 n−1 次就可以有序。写起来更方便,只需要一个数组维护此时各个元素的位置,然后每次while当前元素错位,交换即可,代码:
#include <bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define ll long long
#define pii pair<int, int>
#define db double
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 998244353;
int arr[maxn], pos[maxn];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
vector<pii> ans;
for (int i = 1; i <= n; i++) {
while (arr[i] != i) {
ans.push_back(pii(i, arr[i]));
swap(arr[i], arr[arr[i]]);
}
}
cout << ans.size() << endl;
for (auto [u, v] : ans)
cout << u << " " << v << endl;
// system("pause");
return 0;
}
D - New Friends
并查集,猜结论
一开始我想去在线维护这种过程,后来看样例发现,这种操作可能有连带性,即操作一次新增一条边后,可能又可以根据新增的这条边去操作其他的元素,所以维护肯定维护不了。
然后看样例里面,3个点的时候,最终连线是一个完全图,就可以去猜一下是不是只要连通块,最终都会变成完全图。可以自己画一个4个点的链,发现连着连着确实变成完全图了,所以思路就有了,直接用并查集维护连通块大小。去统计最终状态的总边数,每个连通块设大小为 s i z [ i ] siz[i]

最低0.47元/天 解锁文章
600

被折叠的 条评论
为什么被折叠?



