首页 > 其他分享 >Educational Codeforces Round 168 (Rated for Div. 2)

Educational Codeforces Round 168 (Rated for Div. 2)

时间:2024-08-04 17:08:35浏览次数:10  
标签:Educational Rated int mid void cin dfs Codeforces 节点

题目链接:Educational Codeforces Round 168 (Rated for Div. 2)

总结:题目较简单,但是发挥很一般。A,B题一直读假题,卡了半个小时;C题用char存int,难绷了。

A. Strong Password

tag:模拟

void solve() {
    string s;
    cin >> s;
    
    for (int i = 1; i < s.size(); i ++) {
        if (s[i] == s[i - 1]) {
            cout << s.substr(0, i) << (s[i] == 'a' ? 'b' : 'a') << s.substr(i) << "\n";
            return;
        }
    }
    s += s.back() == 'a' ? 'b' : 'a';
    cout << s << "\n";
}

B. Make Three Regions

tag:模拟

void solve() {
    int n;
    cin >> n;
    
    string s[2];
    cin >> s[0] >> s[1];
    
    int ans = 0;
    for (int i = 1; i < n - 1; i ++) {
        for (int j = 0; j < 2; j ++) {
            if (s[j][i] == '.' && s[j][i - 1] == '.' && s[j][i + 1] == '.' && s[j ^ 1][i] == '.' && s[j ^ 1][i - 1] == 'x' && s[j ^ 1][i + 1] == 'x') {
                ans ++;
            }
        }
    }
    cout << ans << "\n";
}

C. Even Positions

tag:思维

Description:给定一个括号序列,奇数位用\(\_\)表示,对于一个括号序列的花费为\((xxxx)\):\(r - l\),你需要将其还原为花费最少的合法序列。

Solution:先考虑如何还原,我们定义\(x\)为当前\((\)的数量,\(y\)为\()\)的数量,当\(x <= y\)时,我们填\((\),否则填\()\)。

  • 考虑如何计算答案,使用\(stack\),存储\((\)的下标,遇到\()\)时,弹出栈顶比计算答案。
void solve(){
    cin >> n;
    string s;
    cin >> s;
    int x = 0, y = 0;
    s = "$" + s;
    for (int i = 1; i <= n; i ++){
        if (s[i] == '(')
            x ++;
        else if (s[i] == ')')
            y ++;
        else{
            if (x <= y)
                s[i] = '(', x ++;
            else
                s[i] = ')', y ++;
        }
    }
    int ans = 0;
    stack<int> st;
    for (int i = 1; i <= n; i ++){
        if (s[i] == '('){
            st.ep(i);
            continue;
        }
        else{
            int t = st.top();
            st.pop();
            ans += (i - t);
        }   
    }
    
    cout << ans << endl;
}

D. Maximize the Root

tag:dfs

Description:给定一个由\(n\)个节点组成的树,每个点的权值为\(a_i\)。可以执行任意次一下操作:

  • 选择一个有子节点的节点\(v\),将\(v\)加\(1\),其余所有子节点\(-1\)。但是所有值必须大于等于零。
  • 求根节点的最大可能值。

Solution:模拟操作发现,对于非根节点的最大值

  • 如果其值大于所有子节点,那么该值的贡献为子节点中的最小值。

  • 如果该值小于子节点中的最小值,那么该值最大贡献为\((a_i + mi) / 2\)。

  • 对于根节点,只需要加上其子节点的最小值即可。

void solve(){
    cin >> n;
    vector g(n + 1, vector<int>()); 
    vector<int> a(n + 1);

    for (int i = 1; i <= n; i ++)
        cin >> a[i];
    for (int i = 2; i <= n; i ++){
        int x;
        cin >> x;
        g[x].eb(i);
        g[i].eb(x);
    }  

    auto dfs = [&](auto dfs, int v, int u) -> int{
        int res = a[v];
        int t = -1;
        for (auto i : g[v]){
            if (i == u)
                continue;
            if (t == -1)
                t = dfs(dfs, i, v);
            else
                t = min(t, dfs(dfs, i, v));
        }
        if (v == 1){
            return a[1] += t;
        }
        if (t == -1)
            return res;
        if (t <= res)
            return a[v] = t;
        else{
            return a[v] = (res + t) / 2;
        }
    };
    cout << dfs(dfs, 1, -1) << endl;
}

E. Level Up

tag:二分 + 树状数组

Description:有一个长度为\(n\)的序列\(a\),和整数\(x, k\),初始时\(x == 1\)。

  • 一次操作为:从\(1 -> n\)一次判断,每\(k\)次满足\(a_i >= x\),\(x ++\)。

  • 现在有\(q\)次询问,每次询问给定\(i, t\),求当\(k == t\),操作执行到\(i\)时,\(a_i\)是否大于等于\(x\)。

  • \(1 <= n, q <= 2*10^5, 1 <= a_i <= 2*10^5\)

Solution:没有修改操作,首先考虑预处理

  • 我们先考虑\(k\)与\(x\)的关系,显然\(k\)越小\(x\)越大,那么对于每一个\(a_i\),我们可以二分得到一个最小的\(b_i\),使得\(k == b_i\)时,\(a_i >= x\)。但是对每个数处理的时间复杂度为\(O(nlogn)\),总的时间复杂度为\(O(n^2logn)\)
  • 考虑如果优化check函数,对于每一个\(mid\),我们需要知道前面\(i - 1\)个数执行的操作次数。并且我们已经得到\(b_1到b_{i - 1}\),如果\(mid >= b_j\),那么在第\(j\)个数就需要执行操作。因此我们使用树状数组维护前\(i - 1\)个怪物的\(b_i\)值。
  • 对于每一个\(mid\),我们只需要知道前面有多少个\(b_i\)小于等于\(mid\)即可。
int tr[N];

int lowbit(int x){
    return x & -x;
}

void add(int x, int c){
    for (int i = x; i <= n; i += lowbit(i))
        tr[i] += c;
}

LL sum(int x){
    LL res = 0;
    for (int i = x; i > 0; i -= lowbit(i))
        res += tr[i];
    return res;
}

LL aks(int l, int r){
    return sum(r) - sum(l - 1);
}

void solve(){
    int q;
    cin >> n >> q;
    vector<int> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i ++){
        cin >> a[i];
    }

    for (int i = 1; i <= n; i ++){  // 初始化
        int l = 0, r = i + 1;
        while (l + 1 < r){
            int mid = l + r >> 1;
            if (sum(mid) / mid + 1 > a[i])
                l = mid;
            else
                r = mid;
        }
        b[i] = r;
        add(b[i], 1);
    }

    while (q --){
        int i, x;
        cin >> i >> x;
        if (x < b[i])
            cout << "NO\n";
        else
            cout << "YES\n";
    }
}

标签:Educational,Rated,int,mid,void,cin,dfs,Codeforces,节点
From: https://www.cnblogs.com/Sakura17/p/18341950

相关文章

  • Codeforces Round 891 (Div. 3)
    比赛链接完成度:4/7这场比赛相对于上次那场909div3,题目描述清楚许多(可能是出简单了)。首先是B题,一道模拟四舍五入的题目题目B这题就是简单模拟,我们需要读入一个数字字符串,把他输入到一个数组当中,然后从低位到高位找大于等于5的数,如果找到了,那么之前的数包括这个数都变成0,下一......
  • CodeForces-808#D 题解
    思路分析分析样例1:3132原数组被分成1和32两部分,将2移到左边即可。我们设左边部分的和为\(s1\),右边为\(s2\),可以发现对于任何分割方式,只有满足\(s1\pmx=s2\mpx\)才可以继续讨论答案是否成立。推论1:由于\(x\ina\)(\(a\)为题目所给数列),因此\(|\s1-s2......
  • Codeforces Round 909 (Div. 3)--题目描述无法名状
    好吧,可能是我的文字功底太弱了,首先滴就是这个B题题目链接我一开始还以为这个能排序,就是算排完序之后的最大差,但是仔细一看题目,好像不要求使用排序,于是就尝试暴力做法。我发现的暴力做法是枚举k,直到k==n/2为止,当时是因为没有开longlong导致WA了,后面发现时间不是怎么多就没有......
  • Codeforces Round 962 (Div. 3)
    Abstract第一次打CF的比赛~~~~A.LegsIdea签到题,没什么好说的。Code#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;scanf("%d",&t);while(t--){intn;scanf("%d",&n);int......
  • Educational Codeforces Round 168 (Rated for Div. 2)A——D题解
    EducationalCodeforcesRound168(RatedforDiv.2)A——D题解A.StrongPassword题意:给一个小写字符串密码,添加一个小写字母,使得密码更加复杂。题解:有相同的相邻的字母,再其中间添加不同的字母;如果没有相同的相邻的字母,则最后添加一个字母。#include<bits/stdc++.h>......
  • Codeforces Round 903 (Div. 3)(A~F)
    目录A.Don'tTrytoCountB.ThreeThreadletsC.PerfectSquareD.DivideandEqualizeE.BlockSequenceF.MinimumMaximumDistanceA.Don'tTrytoCountProblem-A-Codeforces因为字符串的长度很小,我们可以暴力求解,每次操作都可以使字符串s的长度倍增......
  • CodeForces 1619D New Year's Problem
    题目链接:CodeForces1619D【NewYear'sProblem】思路    可以因为最多只能逛n-1个商店,当n-1大于等于m的时候,所有朋友都能取最大值,否则至少有两个人要选择相同的商店,所以依次枚举两个人选择同一个商店,其他人选择喜悦值最大的商店。代码#include<cstddef>#incl......
  • Educational Codeforces Round 168 (Rated for Div. 2) 赛后总结
    比赛链接赛时提交情况:CF1997A.StrongPassword赛时思路首先看到题目可以想到的是,我们要加入的这个字符不能与其相邻字符相同,所以我没有多想就写出了第一份代码:if(s[0]=='a')cout<<'b';elsecout<<'a';cout<<s<<endl;交上之后喜提WA1。于是冷静了一会儿仔细观察了一......
  • CodeForces 1132B Discounts
    题目链接:CodeForces1132B【Discounts】思路    因为使用coupons购买q[i]块巧克力,不需要付最便宜的那块巧克力的钱,所以为了使得优惠最大化,所以可以在使用优惠券的时候购买最贵的p[i]块巧克力,所以计算所有巧克力价格高之和和排序后很快能得到答案。代码#include<cst......
  • CodeForces 1873A Short Sort
    题目链接:CodeForces1873A【ShortSort】思路    签到题,因为能交换两个元素的位置,所以只需要判断是否有一个元素在他原来该在的位置上就行。代码#include<iostream>#include<cstring>usingnamespacestd;#definelllonglongconstintN=1e5+10;void......