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;
}
posted @ 2022-02-05 23:25  Angels_of_Death  阅读(68)  评论(0)    收藏  举报