A. A Serial Killer(Codeforces 776A)
思路
维护两个字符串,每读取两个字符串就与维护的串作比较,将其中一个替换成另一个即可。
代码
#include <bits/stdc++.h>
using namespace std;
int n;
string a, b, x, y;
int main() {
// freopen("data.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cin >> a >> b >> n;
cout << a << ' ' << b << endl;
for(int i = 1; i <= n; i++) {
cin >> x >> y;
if(a == x) {
a = y;
}
else {
b = y;
}
cout << a << ' ' << b << endl;
}
return 0;
}
B. Sherlock and his girlfriend(Codeforces 776B)
思路
刚看到题目的想法是,模仿素数筛的方法,每扫描到一个素数就将其倍数涂成不同的颜色。后来发现素数涂一种颜色,合数涂另一种颜色即可。那么就是用 埃拉伯色尼筛法 算出哪些是素数就好了。注意特判 n=1,n=2 的情况。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
bool isPrime[maxn];
int n;
int main() {
// freopen("data.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
if(n == 1) {
cout << 1 << endl << 1 << endl;
return 0;
}
if(n == 2) {
cout << 1 << endl << 1 << ' ' << 1 << endl;
return 0;
}
fill(isPrime + 2, isPrime + n + 2, true);
for(int i = 2; i <= n + 1; i++) {
if(isPrime[i] == false) {
continue;
}
for(int j = i + i; j <= n + 1; j += i) {
isPrime[j] = false;
}
}
cout << 2 << endl;
for(int i = 2; i <= n + 1; i++) {
if(isPrime[i] == true) {
cout << 1 << ' ';
}
else {
cout << 2 << ' ';
}
}
return 0;
}
C. Molly’s Chemicals(Codeforces 776C)
思路
首先,因为是求子段和的问题,所以先处理出前缀和,也就是 sum[i] 代表数组元素 a[1..i] 的和。然后可以枚举区间的一个端点 r ,然后枚举