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

Codeforces Round 968 (Div. 2)

时间:2024-08-27 20:22:05浏览次数:5  
标签:ma int 968 Codeforces len cin ++ ans Div

题目链接:Codeforces Round 968 (Div. 2) - Codeforces
总结:C题想到了,但是写成shi了,出得有点慢。

A. Turtle and Good String

tag:签到

Solution:直接判断第一个字符是否与最后一个字符相等即可。

void solve(){
    cin >> n;
    string s;
    cin >> s;
    if (s[0] == s[n - 1]){
        cout << "No\n";
    }
    else{
        cout << "YES\n";
    }
}

B. Turtle and Piggy Are Playing a Game 2

tag:博弈论

Solution:显然每次操作要么是删除最小值,要么是删除最大值。排序后输出中间值即可。

void solve(){
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++){
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    cout << a[n / 2] << endl;
}

C. Turtle and Good Pairs

tag:思维

Description:给定一个字符串 s s s,对于一对整数 ( i , j ) (i, j) (i,j),当 s i = = s j si == sj si==sj或者存在一个整数 k k k,使得 s k ! = s k + 1 s_k != s_{k + 1} sk​!=sk+1​,且 s k ! = s i ∣ ∣ s k + 1 ! = s j s_k != s_i || s_{k + 1} != s_j sk​!=si​∣∣sk+1​!=sj​, ( i , j ) (i, j) (i,j)为一对好的配对。将字符串重排,使好的配对数最大。

Solution:我们令 k = = i k == i k==i,那么只要 s i + 1 ! = s i 且 s i + 1 ! = s j s_{i + 1} != s_{i} 且 s_{i + 1} != s_{j} si+1​!=si​且si+1​!=sj​即可,那么显然我们需要尽可能多的相邻两个字符不同的组合即尽可能使相邻两个字符不同。

  • 其实只需要按顺序排列字符即可,多的字符全放在后面。

Competing:没仔细想,认为尽可能使相邻字符不同,因此需要判断出现次数最多的字符。

void solve(){
    cin >> n;
    cin >> s;
    int ma = 0;  // 出现次数最多的字符
    char c;
    map<char, int> mp;
    vector<int> a(26);
    for (int i = 0; i < n; i ++){
        mp[s[i]] ++;
        if (mp[s[i]] > ma){
            ma = mp[s[i]];
            c = s[i];
        }
        a[s[i] - 'a'] ++;
    }
    if (ma < n - ma + 1){
        string ans = "";
        int c = 0;
        while (c < n){
            for (int i = 0; i < 26; i ++){
                if (a[i]){
                    a[i] --;
                    ans += char(i + 'a');
                    c ++;
                }
            }
        }
        cout << ans << endl;
    }
    else{
        string ans = "";
        int cnt = 0;
        a[c - 'a'] = 0;
        bool flag = true;
        while (cnt < n && flag){
            flag = false;
            for (int i = 0; i < 26; i ++){
                if (a[i]){
                    a[i] --;
                    ans += c;
                    ma --;
                    ans += char(i + 'a');
                    cnt ++;
                    flag = true;
                }
            }
        }
        while (ma){
            ans += c;
            ma --;
        }
        cout << ans << endl;
    }
}

D1. Turtle and a MEX Problem (Easy Version)

tag:思维

Description:给定 n n n个序列,以开始有一个非负整数 x x x:

  • 每次操作可以任选一个序列,令 x = m e x ( x , a 1 , a 2 , . . . , a n ) x = mex(x, a_1, a_2, ..., a_n) x=mex(x,a1​,a2​,...,an​)。即 f ( x ) f(x) f(x)为初始值为 x x x,操作之后可以得到的最大值。
  • 给定一个 m m m,求 ∑ 0 m f ( m ) \sum_{0}^{m}f(m) ∑0m​f(m)。

Solution:对于每个序列,我们最多操作两次,可以得到每个序列的第二个 m e x 2 mex2 mex2。那么当 x x x小于最大的 m e x 2 mex2 mex2时,将其变成 m e x 2 mex2 mex2,否则使用 x x x本身。

void solve(){
    cin >> n >> m;
    vector<pii> a(n);
    int ma = 0;
    for (int i = 0; i < n; i ++){
        int len;
        cin >> len;
        vector<int> t(len + 10);
        for (int j = 0; j < len; j ++){
            int x;
            cin >> x;
            if (x < len + 10)
                t[x] = 1;
        }
        int c = 1;
        for (int j = 0; j <= len + 5 && c <= 2; j ++){
            if (!t[j] && c == 1){
                a[i].fi = j;
                c ++;
            }
            else if (!t[j]){
                c ++;
                a[i].se = j;
                ma = max(ma, j);
                break;
            }
        }
    }
    int ans = 0;
    if (m <= ma){
        ans += (m + 1) * ma;
    }
    else{
        ans += (ma + 1) * ma;
        ans += (ma + 1 + m) * (m - ma) / 2;
    }
    cout << ans << endl;

}

D2. Turtle and a MEX Problem (Hard Version)

tag:思维

Solution:和D1的唯一区别时,在一次操作中每个序列最多使用一次。

  • 对于第 i i i个序列,我们建一条有向边 u i − > v i u_i -> v_i ui​−>vi​。那么一次操作 x x x可以沿着一条出边移动,或者移动到一个任意点 u u u,并断开它的出边。
  • 我们先倒序处理一下,令 b i b_i bi​等于 i i i能够到达的最大值,我们先倒序处理一下。
  • 首先一个 x x x的答案至少是 f x f_x fx​,所有 x x x的答案至少是 max ⁡ 1 n u i \max_{1}^{n}u_i max1n​ui​;对于所有出度大于 1 1 1的 i i i, x x x的答案至少是 f i f_i fi​。
  • 实现步骤:倒序处理 f i f_i fi​、记录每个点的出度、记录度大于 2 2 2的最大的 f i f_i fi​、记录最大的 u i u_i ui​。
void solve(){
    cin >> n >> m;
    vector<pii> a(n);
    int ma = 0;
    for (int i = 0; i < n; i ++){
        int len;
        cin >> len;
        ma = max(ma, len);
        vector<int> t(len + 10);
        for (int j = 0; j < len; j ++){
            int x;
            cin >> x;
            if (x < len + 10)
                t[x] = 1;
        }
        int c = 1;
        for (int j = 0; j <= len + 5 && c <= 2; j ++){ // 处理u,v的值
            if (!t[j] && c == 1){
                a[i].fi = j;
                c ++;
            }
            else if (!t[j]){
                c ++;
                a[i].se = j;
                break;
            }
        }
    }
    sort(a.begin(), a.end(), 
    [&](pii a, pii b){
        return a.fi > b.fi;
    });
    int mma = 0;  // 最大的ui
    vector<int> b(ma + 10);
    vector<int> chu(ma + 10);
    for (auto [x, y] : a){  // 倒序处理
        mma = max(mma, x);
        int t = max(y, b[y]);
        b[x] = max(b[x], t);
        chu[x] ++;
    }
     
    int t2 = -1;  // 度大于2的,最大的bi
    for (auto [x, y] : a){
        if (chu[x] >= 2 && b[x] > t2){
            t2 = b[x];
        }
    }
    int ans = 0;
    for (int i = 0; i <= ma + 5 && i <= m; i ++){
        b[i] = max({i, b[i], t2, mma});
        ans += b[i];
    }
    if (m > ma + 5){
        ans += (ma + 6 + m) * (m - ma - 5) / 2;
    }
   
    cout << ans << endl;
}

标签:ma,int,968,Codeforces,len,cin,++,ans,Div
From: https://blog.csdn.net/MenghuanL/article/details/141611712

相关文章

  • Pinely Round 4 (Div. 1 + Div. 2) VP记录
    PinelyRound4(Div.1+Div.2)VP记录场上打了ABCDF,被E二粉兔创飞了。这场的构造题有:BDEGI,乐死了。A把数列黑白染色,第一个格为黑色,那么每次删除会删除一个黑格子和一个白格子。而黑格子始终比白格子多一个,因此最后选到的是黑格子。答案极为黑格子的最大值,也易证一......
  • Codeforces Round 967 (Div. 2)
    题目链接:CodeforcesRound967(Div.2)-Codeforces总结:B题没测试就交wa一发,C题一直没想到怎么回溯,哎。A.MakeAllEqualtag:签到Solution:找到相同元素的最大值,将其它所有元素删去。voidsolve(){cin>>n;vector<int>a(n);map<int,int>mp;intans......
  • Codeforces Round 962 (Div. 3)
    A.Legs若只判断题,根据模4意义下分类即可。B.Scale模拟题,缩小同值矩阵即可。C.Sort对每个字母求前缀数量和,答案就是两端点的差。constintN=2e5+5;intT,n,q;chara[N],b[N];intc[N][26],d[N][26];signedmain(void){ for(read(T);T;T--){ read(......
  • 基于SpringBoot的大学生综合素质积分考核系统---附源码96814
    摘要  随着教育水平的提高和学校教育的全面发展,大学生综合素质积分考核在培养学生全面发展方面起到了重要作用。然而,传统的考核方式存在一些问题,如流程繁琐、数据管理不便等。因此,开发一个基于SpringBoot的大学生综合素质积分考核系统具有重要的实际意义。本系统旨在......
  • Codeforces Round 968 (Div. 2)
    A.TurtleandGoodStrings题意:确定是否存在一种方案使得\(s=t_1+t_2+\cdots+t_m\),满足\(m>1\)且任意\(i<j\),\(t_i\)的第一个字母不等于\(t_j\)的最后一个字母。\(s_1\)和\(s_n\)一定不属于一个子串,因此\(s_1\nes_n\)是条件非法的必要条件。那么反......
  • Codeforces Round 968 (Div. 2)
    A.TurtleandGoodStrings思路:题意大致为把一个字符串分成若干段,要求每两段,前一段的首字符不能等于后的一段的尾字符,给你一个字符串,能不能构造出合法方案。观察到,分的段数越小,越有助于我们判断。所以,不妨分成两段,问题转化为判断首尾字符是否相等。代码:#include<bits/stdc++.......
  • [ARC182C] Sum of Number of Divisors of Product 题解
    题目链接点击打开链接题目解法我怎么不会分治/fn首先把\(x\)分解成\(\prodp_i^{x_i}(0\lei\le5)\)的形式,正因数个数为\(\prod(x_i+1)\)有一个很牛的想法是:合并两个\(x_i\)序列(假设一个叫\(x_0,...,x_5\),另一个叫\(y_0,...,y_5\))先不考虑后面的\(+1\)(可以最后......
  • Codeforces Round 968 (Div. 2)
    良心出题人给了中文题解!!!A.TurtleandGoodStrings长度为\(n\)的字符串至少分成两段,使\(\foralli<j\),第\(i\)段的首字符不等于第\(j\)段的尾字符第一个字符一定作为首字符,最后一个字符一定作为尾字符,只要判断这两个字符是否相等即可相等的话一定无解,不相等一定有......
  • EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)
    Preface两个礼拜前打的比赛拖到现在才写博客,我只能说也是个神人了这场其实D2很快就想到做法了,但自己把自己给否了,后面不管了实现了一发交上去发现过了然后这天由于12点左右室友就关灯睡觉了,我写完D2后看了眼E没仔细想就睡觉去了,后面发现E其实很trivialA.Distance......
  • Codeforces Round #900 (Div. 3)
    三年之后第一次打比赛,用小号打了场\(Div.3\),居然没有AK,感觉实力退步到小学了。A.HowMuchDoesDaytonaCost?若只判断题,只要判断\(\{a_n\}\)中是否存在\(k\)即可。B.AleksaandStack构造方法不唯一,我直接输出奇数列,显然正确。C.VasilijeinCacak若只判断题......