传送门

A Yura's New Name

签到题,怪我没有皇后看样例子,意思就是把有^和_组成的字符串加若干个字符使得全部都是笑脸(^^或^_^),所一我们遍历一下字符串,把连着都是两个的地方加上^即可,最后处理一下开头和结尾就行

#include<bits/stdc++.h>

#define int long long
#define endl '\n';

using namespace std;

const int N = 300010;

int a[N];
int n;

void solve() {
    string s;
    cin >> s;
    int ans = 0;
    if (s.size() == 1 && s[0] == '^') {
        cout << 1 << endl;
        return;
    }
    for (int i = 0; i < s.size() - 1; i++) {
        if (s[i] == '_' && s[i + 1] == '_')ans++;
    }
    if (s[0] == '_')ans++;
    if (s[s.size() - 1] == '_')ans++;
    cout << ans << endl;
}

int32_t  main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int h_h;
    cin >> h_h;
    while (h_h--)solve();
    return 0;
}

B JoJo's Incredible Adventures

比赛时已经想出来了,但是有些细节没有考虑到,没过可惜,题目的意思就是找出字符串种连续1 的个数最长,并且还要考虑首尾都有1是可以连在一起的,最后在1和n+1,2和n,3和n-1.....求出当中的最大值就是答案。

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int N = 110;

void solve() {
    string s;
    cin >> s;
    int mx = INT_MIN;
    int cnt = 0;
    if (s[0] == '1' && s[s.size() - 1] == '1') {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '0')break;
            cnt++;
        }
        for (int i = s.size() - 1; i >= 0; i--) {
            if (s[i] == '0')break;
            cnt++;
        }
    }
    if (cnt == s.size() * 2) {
        cout << cnt * cnt / 4 << endl;
        return;
    }
    //cout << cnt << endl;
    mx = max(cnt, mx);
    cnt = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '0') {
            mx = max(cnt, mx);
            cnt = 0;
        } else cnt++;
    }
    mx = max(cnt, mx);
    //cout << mx << endl;
    int ans = 0;
    for (int i = 1; i <= (mx + 1) / 2; i++) {
        ans = max(ans, i * (mx - i + 1));
    }
    cout << ans << endl;
}

int32_t main() {
    int h_h;
    cin >> h_h;
    while (h_h--)solve();
    return 0;
}

C Constructive Problem

这题涉及到一个mex(),就是求一个集合中没有出现的最小值,题目想让先求出原始集合的mex值,改变一段区间内的所有数,复制为原始集合的mex值,问能不能让改变了的集合的mex值增加1,可以先找楚mex值,并且确定集合中所有的等于mex+1的值的区间,并且全部复制为mex,在check就一遍,但要注意,有可能找不到等于mex+1的值,那么就说明这个值就是区间里的最大的值,无法满足条件,还有可能是mex和mex+1都没有,就可以把大于mex+1的元素改为mex就可以了。

#include<bits/stdc++.h>

using namespace std;

const int N = 200010;

int a[N];
int n, m, k;

int Mex(int a[]) {
    map<int,int> mp;
    int mx = 0;
    for (int i = 0; i < n; i++)mp[a[i]]++, mx = max(mx, a[i]);
    for (int i = 0; i <= mx + 1; i++) {
        if (mp[i] == 0)return i;
    }
}

void solve() {
    cin >> n;
    for (int i = 0; i < n; i++)cin >> a[i];
    //cout << Mex(a) << endl;
    int mex = Mex(a);
    int l = 1e9, r = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] == mex + 1) {
            l = min(l, i);
            r = max(r, i);
        }
    }
    if (l == 1e9) {
        if (mex == n)puts("No");
        else puts("Yes");
        return;
    }
    for (int i = l; i <= r; i++)a[i] = mex;
    int mex1 = Mex(a);
    if (mex1 == mex + 1)puts("Yes");
    else puts("No");
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int h_h;
    cin >> h_h;
    while (h_h--)solve();
    return 0;
}