前言

好久不见,再为上周出的小白月赛给大家带来不好的体验道个歉,不会G待补,看不懂我的文字题解的去牛客b站的官网看视频题解,讲得很好!


题解


A.小苯晨跑

用任何你喜欢的方式判断这四个数是否相等

#include<bits/stdc++.h>

using i64 = long long;

void solve() {
    std::vector<int> a(5);
    for (int i = 1; i <= 4; i++) {
        std::cin >> a[i];
    }
    std::sort(a.begin() + 1, a.end());
    if (a[1] == a[4]) {
        std::cout << "NO\n";
    }
    else {
        std::cout << "YES\n";
    }
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    std::cin >> t;
    while (t--) {
        solve();
    }
}

B.小苯过马路

由于题中说了一旦开始走了就不会停下,那我们就看看什么时候会出发就好了,如果当前是绿灯,并且剩余的时间足够小苯过马路,那就会立即出发,如果不够,那就等到下一个绿灯再出发,如果当前是红灯,那就等到绿灯出发就好了。

#include<bits/stdc++.h>

using i64 = long long;

void solve() {
    int x, y, k, t;
    char c;
    std::cin >> x >> y >> k >> t >> c;
    if (c == 'G') {
        if (t <= k) {
            std::cout << t << '\n';
        }
        else {
            std::cout << t + k + x << '\n';
        }
    }
    else {
        std::cout << k + t << '\n';
    }
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    // std::cin >> t;
    while (t--) {
        solve();
    }
}

C.小苯的字符串染色

选择一个奇数长度的区间,还不超过n次操作,这不就是在暗示我挨个染一遍就好了吗!管他是黑还是白,都只对这一个操作染成白的

#include<bits/stdc++.h>

using i64 = long long;

void solve() {
    int n;
    std::cin >> n;
    std::string s;
    std::cin >> s;
    s = ' ' + s;
    std::cout << n << '\n';
    for (int i = 1; i <= n; i++) {
        std::cout << i << ' ' << i << '\n';
    }
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    std::cin >> t;
    while (t--) {
        solve();
    }
}

D.小苯的能量项链

维护求一个后缀最大值即可,然后我们枚举删除从左数几个,去看后缀最大值是多少,比如n==5 , k==4时,我们枚举左边删除2个,那么还可以删除两次,那我们就看从右往左的3个中最大的是那个保存就好了,至于删除两次为什么会去比较三个中的最大值,那当然是因为不删除,删除一个和删除两个会剩下的了!

#include<bits/stdc++.h>

using i64 = long long;

void solve() {
    int n, k;
    std::cin >> n >> k;
    std::vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        std::cin >> a[i];
    }
    if (n == 1) {
        std::cout << a[1] << '\n';
        return;
    }
    std::vector<int> suf(n + 2, -1);
    for (int i = n; i >= 1; i--) {
        suf[i] = std::max(a[i], suf[i + 1]);
    }
    suf[0] = suf[1];
    int ans = a[1] + a[n];
    for (int i = 1; i <= std::min(n, k); i++) {
        ans = std::max(ans, a[i] + suf[std::max(i + 1, n - (k - i + 1))]);
    }   

    std::cout << ans << '\n';
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    std::cin >> t;
    while (t--) {
        solve();
    }
}

E.小苯的最短路

这个我纯猜,大家可以把n==3的答案算出来,会发现是1,那我们观察n分别为1,2,3,4时的答案,答案就是1到n的异或和,这个时候你算出来肯定会说样例都过不了!对了,我们再观察一下,会发现n为奇数时,给答案异或上一个1就是答案。具体证明过程去看视频讲解吧

#include<bits/stdc++.h>

using i64 = long long;

int xorSum(int n) {
    if (n % 4 == 0)
        return n;
    else if (n % 4 == 1)
        return 1;
    else if (n % 4 == 2)
        return n + 1;
    else
        return 0;
}

void solve() {
    int n;
    std::cin >> n;
    int x = xorSum(n);
    if (n & 1) {
        std::cout << (x ^ 1) << '\n';
    }
    else {
        std::cout << x << '\n';
    }
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    std::cin >> t;
    while (t--) {
        solve();
    }
}

F.小苯的优雅好序列

这个建议直接去看视频题解吧,我还是猜,代码仅供参考,我也不知道该怎么说。

#include<bits/stdc++.h>

using i64 = long long;

void solve() {
    int n, k;
    std::cin >> n >> k;
    std::set<int> st;
    for (int i = 1; i <= n; i++) {
        int a;
        std::cin >> a;
        st.insert(a);
    }
    if (st.size() == 1) {
        std::cout << k << ' ' << 1ll * k * (1 + k) / 2 << '\n';
        return;
    }
    std::vector<int> a;
    for (auto it : st) {
        a.push_back(it);
    }
    n = a.size();
    int g = 0;
    for (int i = 1; i < n; i++) {
        g = std::__gcd(a[i] - a[i - 1], g);
    }
    i64 cnt = 0, ans = 0;
    for (int i = 1; i * i <= g; i++) {
        if (g % i == 0) {
            if (i - a[0] >= 1 && i - a[0] <= k) {
                cnt++;
                ans += i - a[0];
            }
            if (g / i != i) {
                if (g / i - a[0] >= 1 && g / i - a[0] <= k) {
                    cnt++;
                    ans += g / i - a[0];
                }
            }
        }
        
    }

    std::cout << cnt << ' ' << ans << '\n';
}  

signed main() {
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);   
    std::cin.tie(0);
    
    i64 t = 1; 
    std::cin >> t;
    while (t--) {
        solve();
    }
}