首页 > 其他分享 >Codeforces Round 932 (Div. 2)

Codeforces Round 932 (Div. 2)

时间:2024-03-06 12:22:46浏览次数:29  
标签:int ll Codeforces long using pair 932 Div define

Codeforces Round 932 (Div. 2)

A - Entertainment in MAC

解题思路:

如果翻转字符小于原字符,那么一直翻转即可。

否则,翻转\(n - 1\)次,然后添加一次。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
typedef double db;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
const int N = 6010;

void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    string rs = s;
    reverse(rs.begin(), rs.end());
    if (s <= rs)
    {
        cout << s << endl;
    }
    else
    {
        rs += s;
        cout << rs << endl;
    }
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B - Informatics in MAC

解题思路:

如果有解,一定能只划分为两个区间。

从左向右遍历,实时维护前后缀的\(mex\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
typedef double db;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
const int N = 6010;

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1), cl(n + 1), cr(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        cr[a[i]]++;
    }
    int l = 0;
    int r = 0;
    while (cr[r] > 0)
    {
        r++;
    }
    for (int i = 1; i < n; i++)
    {
        cl[a[i]]++;
        cr[a[i]]--;
        if (cr[a[i]] == 0)
        {
            if (r > a[i])
            {
                r = a[i] + 1;
            }
        }
        while (cl[l] > 0)
        {
            l++;
        }
        while (r > 0 && cr[r - 1] == 0)
        {
            r--;
        }
        if (l == r)
        {
            cout << 2 << endl;
            cout << 1 << ' ' << i << endl;
            cout << i + 1 << ' ' << n << endl;
            return;
        }
    }
    cout << -1 << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C - Messenger in MAC

解题思路:

同样的元素集合,一定是按照\(b\)升序排列花费最小。

按\(b\)进行升序排序,枚举左右两个端点,\(b\)的总和就确定了。取区间中尽量多的最小的\(a\),使得花费小于等于\(l\)。

所以我们就是要维护区间中的\(a\)有序,然后尽量多取较小的\(a[i]\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
typedef double db;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
const int N = 6010;

void solve()
{
    ll n, m;
    cin >> n >> m;
    vector<pii> v(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i].fi >> v[i].se;
    }
    sort(v.begin(), v.end(), [&](auto a, auto b)
         { return a.se < b.se; });
    ll ans = 0;
    for (int i = 1; i <= n; i++)
    {
        // cost 维护了[l,r]的a的和减去一个b[i]
        ll cost = -v[i].se;
        priority_queue<int> q;
        for (int j = i; j <= n; j++)
        {
            q.push(v[j].fi);
            cost += v[j].fi;
            if (!q.empty() && cost + v[j].se > m)
            {
                cost -= q.top();
                q.pop();
            }
            ans = max(ans, (ll)q.size());
        }
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D - Exam in MAC

解题思路:

考虑容斥:总对数 - 通过\(a[i]\)单个排除的对数 + 重复减去的对数。

对于\(a[i]:\)

  • 考虑\(x + y = a[i]\):\((0,a_i),(1, a_i-1),...,(\frac{a_i}{2},a_i -\frac{a_i}{2})\)。
  • 考虑\(y - x = a_i:\)\((0,a_i),(1,a_i + 1),...,(c - a_i,c)\)。

自身排除对数时有一个重复对。

不同\(a\)之间会重复的只有较小\(a_i\)的\(y_i -x_i = a_i\),\(y_i + x_i = a_j\)这种情况。

如果\(a_i\)为奇数,那么\(y_i + x_i\)一定为奇数;如果\(a_i\)为偶数,那么\(y_i + x_i\)一定为偶数;

所以,较小的奇数一定会对较大的奇数造成一次对数删除重复,遍历记录奇偶个数即可。

举例:\(3 - 1= 2,3 + 1 = 4,4 - 2= 2, 4 +2 = 6\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
typedef double db;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
const int N = 6010;

void solve()
{
    ll n, c;
    cin >> n >> c;
    vector<ll> a(n + 1);
    // 计算总对数
    ll ans = (c + 2) * (c + 1) / 2;
    // 减去非法对
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        // x + y == a[i]
        ans -= a[i] / 2 + 1;
        // y - x == a[i]
        ans -= c - a[i] + 1;
    }
    // 加上重复减去的对
    vector<int> cnt(2);
    for (int i = 1; i <= n; i++)
    {
        cnt[a[i] % 2]++;
        ans += cnt[a[i] % 2];
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:int,ll,Codeforces,long,using,pair,932,Div,define
From: https://www.cnblogs.com/value0/p/18056264

相关文章

  • div contenteditable="true" 添加placehoder效果
    <divclass="contain":style="{height:editableHeight+'px'}" v-html="innerText" ref="editableDiv" contenteditable="true" :placeholder=placeholder @input="inputTe......
  • css div 三张背景图片
    cssdiv宽度1300高度46,同时给它设置三张背景图片堆叠同时显示,其一图片宽度1300高度46,铺满整个div且距离最左侧偏移22px,其二图片宽度44,高度43,在div的最左端,其三图片宽度83,高度43,在div的最右端,他们同时垂直居中在div中  .container{width:1300px;height:4......
  • Codeforces Round 930 (Div. 1)
    Preface虽然难得有Div1的CF,但由于在周四晚上学校要断电就没打这两天有空去补了下发现好像错过了最适合我的一场,AB都是一眼题,C是经典图论建模,D是DS典题没有Counting我直接爽飞,不过估计现场打的话写个ABC差不多了,D的码量还是挺大的A.BitwiseOperationWizard很有意思的一个......
  • CodeForces 1540D Inverse Inversions
    洛谷传送门CF传送门小清新题。首先容易发现每个合法的\(b\)唯一对应一个排列,大概就是每个时刻排列元素的相对顺序,然后插入到相应的位置。但是这样太麻烦了。发现题目只要求求单点的\(p\)值。这应该有更简单的方法。考虑令\(b_i\getsi-b_i\)表示\(p_i\)在前缀\(......
  • CSES1081:Common Divisors
    传送门题意:找到两个\(gcd\)最大的数。\(n\le2e5,a_i\le1e6\)。一种方法是枚举\(i:1\simn\),\(O(\sqrta_i)\)把\(a_i\)因数的出现次数加一。然后\(i:1000000\sim1\),如果\(cnt[i]>1\),输出\(i\)结束。复杂度\(O(n\sqrtV)\),\(2e8\),可惜CSES的机子跑不过。枚......
  • Codeforces edu 156 C题
    https://codeforces.com/contest/1886/problem/C思路这道题的核心问题是:给你一个字符串s,你要删除k个字母,你要找出删除k个字母后字典序最小的s。为了使字典序最小,我们就应该把字符串删成递增的样子stringtmp="";//tmp用来存删完后的字符串s+='$';//s的末尾加一个比'......
  • Educational Codeforces Round 162 E 点分治 虚树 树形dp
    传送门给出\(n\le2\cdot10^5\)的一棵树,每个节点有一个颜色。求出路径长度为\(2\)路径首端和尾端拥有相同颜色,且路径上其他点不存在相同颜色的点的路径条数。当时看错题了,把颜色抽出来后没法做了。后来感觉能点分治,然后把题看对了,遂写了一个极其抽象的点分治。除此之外,把某......
  • Codeforces Round 930 (Div. 1) C dij 建图
    离较好的方法差一点。考虑到了可以按照枚举属性并按照当前属性从小到大排序,这样可以从一个点到大另一个点。设当前在排序序列中点为\(i\)当\(i\)走向\(k,i>=k\)需要支付\(c_k\)的代价。而\(i\)到\(k,i<k\)则需\(k-i+c_k\)的代价。则对于不同的\(i\)由于代价没有连续性,当时想......
  • Codeforces Round 892 (Div. 2)
    \[\large\text{Round7:CodeforcesRound892(Div.2)(VP)}\]一言:所谓人,无论是谁到了最后,都会形单影只。——悠久之翼2最令人无语的是最后三分钟交代码的时候把\(\text{D}\)题交到了\(\text{E}\)题,结果能过的代码直接没有过。。\(\text{D:AndreyandEscapefr......
  • Educational Codeforces Round 120
    \[\large\text{Round1:EducationalCodeforcesRound120(VP)}\]一言:孤独的人不会伤害别人,只会不断地伤害自己罢了。——我的青春恋爱物语果然有问题\(\text{C:SetorDecrease}\)后四题唯一场切题,(别问我为什么只有这一道)。读完题之后,理一下思路,可以很容易的想到......