Codeforces Round 923 (Div. 3) A-G

A

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine

void solve()
{
    int n;
    cin >> n;
    vector<char> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int l = 1, r = n;
    for (int i = 1; i <= n; i++)
        if (a[i] == 'B')
        {
            l = i;
            break;
        }
    for (int i = n; i >= 1; i--)
        if (a[i] == 'B')
        {
            r = i;
            break;
        }
    cout << r - l + 1 << endl;
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

B

用vector维护每个字母当前已经出现了多少次

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    vector<vector<int>> e(n + 1);
    for (int i = 0; i < 26; i++)
        e[0].push_back(i);
    vector<int> ans(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        auto t = e[a[i]].back();
        e[a[i]].pop_back();
        ans[i] = t;
        e[a[i] + 1].push_back(t);
    }
    for (int i = 1; i <= n; i++)
        cout << char('a' + ans[i]);
    cout << endl;
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

C

先考虑只能在a/b中选的,如果大于\(\frac{k}{2}\),则不行

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine

void solve()
{
    int n, m, k;
    cin >> n >> m >> k;
    map<int, int> mpa, mpb;
    vector<int> a(n + 1), b(m + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i], mpa[a[i]] = 1;
    for (int i = 1; i <= m; i++)
        cin >> b[i], mpb[b[i]] = 1;
    // sort(a.begin() + 1, a.end());
    // sort(b.begin() + 1, b.end());
    // vector<int> both;
    int cnta = k / 2, cntb = k / 2;
    // cout << cnta << " " << cntb << endl;
    for (int i = 1; i <= k; i++)
        if (mpa[i] || mpb[i])
        {
            if (mpa[i] && mpb[i])
            {
            }
            else
            {
                if (mpa[i])
                    cnta--;
                else
                    cntb--;
            }
        }
        else
        {
            cout << "NO" << endl;
            return;
        }
    // cout << cnta << " " << cntb << endl;
    if (cnta >= 0 && cntb >= 0)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

D

如果\(a[i]\ne a[i-1]\),那么就让前缀和\(s[i]\)+1,对于每个询问\(l,r\),先看\(s[l]\)是否等于\(s[r]\),如果不等,说明存在,再二分找到答案即可。

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine

void solve()
{
    int n, q;
    cin >> n;
    vector<int> a(n + 1), s(n + 1, 0);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 2; i <= n; i++)
    {
        s[i] = s[i - 1];
        if (a[i] != a[i - 1])
            s[i]++;
    }
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        int x, y;
        cin >> x >> y;
        int l = x + 1, r = y;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (s[mid] != s[x])
                r = mid;
            else
                l = mid + 1;
        }
        if (s[l] != s[x])
            cout << x << " " << l << endl;
        else
            cout << "-1 -1" << endl;
    }
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

E

题目要求\(max(s)-min(s)\le 1\),那么可以想到类似滑动窗口的东西,左边弹出x后,右边加入一个x+1/x-1,来满足条件。
然后就可以采用这种类似的方法,枚举前k个位置,每隔k,+1/-1。

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine
void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    int mi = 1, mx = n;

    for (int i = 1; i <= k; i++)
    {
        if (i & 1)
        {
            for (int j = i; j <= n; j += k)
                a[j] = mx--;
        }
        else
        {
            for (int j = i; j <= n; j += k)
                a[j] = mi++;
        }
    }
    for (int i = 1; i <= n; i++)
        cout << a[i] << " ";
    cout << endl;
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

F

先用最大生成树找到最小的可以形成环的边,然后用除这条边以外的其他边建图,dfs出环上的其他点。

#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef double db;
const ll mod = 998244353;
const int N = 5e5 + 10, M = 25;
random_device rd;        // 将用于为随机数引擎获得种子
mt19937_64 gen(time(0)); // 以播种标准 mersenne_twister_engine

void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    int mi = 1, mx = n;

    for (int i = 1; i <= k; i++)
    {
        if (i & 1)
        {
            for (int j = i; j <= n; j += k)
                a[j] = mx--;
        }
        else
        {
            // int num = 0;
            // for (int j = i; j <= n; j += k)
            //     num++;
            // st += num;
            // cout << "st?" << st << endl;
            // int mx = st;
            for (int j = i; j <= n; j += k)
                a[j] = mi++;
        }
    }
    for (int i = 1; i <= n; i++)
        cout << a[i] << " ";
    cout << endl;
}
int main()
{
    // cout << setprecision(5);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

G


posted @ 2024-02-08 21:18  0x3ea  阅读(7)  评论(0编辑  收藏  举报