AtCoder Beginner Contest 238
A
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
int n;
cin >> n;
if (n == 1) {puts("Yes"); return 0;}
if (n > 4) puts("Yes");
else puts("No");
return 0;
}
B
维护前缀和,每次将前\(i\)个角度的和取模\(360\)后放到一个数组中,并将\(0和360\)放入
将数组排序,每个角度即为数组中相邻两项的差
#include <bits/stdc++.h>
using namespace std;
int a[1000], sum[1000];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
vector<int> v;
for (int i = 1; i <= n; i ++ )
v.push_back(sum[i] % 360);
sort(v.begin(), v.end());
int maxx = v[0];
for (int i = 1; i < v.size(); i ++ )
maxx = max(maxx, v[i] - v[i - 1]);
maxx = max(maxx, 360 - v[n - 1]);
cout << maxx << endl;
return 0;
}
C
注意取模
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MOD = 998244353;
int main() {
LL n, m;
cin >> n;
m = n;
int len = 0;
while (m) {
m /= 10;
len ++;
}
LL res = 0, p = 10;
for (int i = 1; i < len; i ++ ) {
if (p > 10) {
LL k = p - p / 10;
res = (res + k / 2 % MOD * ((k + 1) % MOD) % MOD) % MOD;
}
else
res += 45;
p *= 10;
}
n -= (p / 10);
n ++;
if (n % 2 == 0) res = (res + (n + 1) % MOD * ((n / 2) % MOD) % MOD) % MOD;
else res = (res + (n + 1) / 2 % MOD * (n % MOD) % MOD) % MOD;
cout << res << endl;
return 0;
}
D
我们可以设\(x=a,y=a\)
由于\(x\&y = a\),所以在\(x和y\)的相同位上最多只能有\(1\)个是\(1\)
问题就可以转化为\(k=s - a*2\)和\(a\)与运算后是否为\(0\)
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
while (T -- ) {
int a, s;
cin >> a >> s;
if (a > s / 2) puts("No");
else {
vector<int> v;
int k = s - a * 2;
bool flag = !(k & a);
if (flag) puts("Yes");
else puts("No");
}
}
return 0;
}
F
我们可以构建一个由\(n+1\)个节点和\(Q\)条边的图
其中每个节点\(b_{i}=a_{1}+a_{2}+...+a_{i}\)
对于每条无向边边连接\(l_{i-1} \Rightarrow r_{i}\)
那么最终的判断条件就是节点\(0和n\)时候相连
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, Q;
cin >> n >> Q;
vector<int> p(n + 1);
for (int i = 0; i <= n; i ++ ) p[i] = i;
function<int(int)> find = [&](int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
};
while (Q -- ) {
int a, b;
cin >> a >> b;
p[find(a - 1)] = find(b);
}
if (find(0) == find(n)) puts("Yes");
else puts("No");
return 0;
}