Codeforces Round 925 (Div. 3) A-F

这篇文章详细解析了CodeforcesRound925比赛中的五个问题(A-F),涉及字符串操作、整数处理、平均值计算、连续子序列比较、模运算和拓扑排序等基础算法。通过实例代码展示了如何解决这些简单的Div.3级别问题。
摘要由CSDN通过智能技术生成

Codeforces Round 925 (Div. 3) A-F 训练记录

链接:https://codeforces.com/contest/1931

难度自评:A < B = C < E < F < D < G(??

算是很简单的一场 div3。

A. Recovering a Small String

优先放第三个,放满了再放第二个,最后是第一个。

需要注意的是,仨位置都至少有一个。

#include <iostream>

using namespace std;

void solve(){
    int n; cin >> n;
    int a = 1, b = 1, c = 1; n -= 3;
    while(n--){
        if(c < 26) c++;
        else if(b < 26) b++;
        else a++;
    }
    cout << (char)('a' + a - 1) << (char)('a' + b - 1) << (char)('a' + c - 1) << '\n';
}

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

B. Make Equal

如果最后能全都相等,显然每一个都取到了平均值。

所以我们先算一下 avg,再根据每个 a[i] 多退少补即可。

如果中间不够了就直接输出 NO

#include <iostream>
#include <vector>

#define int long long

using namespace std;

bool solve(){
    int n; cin >> n;
    vector <int> a(n+1);
    int sum = 0;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        sum += a[i];
    }
    if(sum % n) return false;
    sum /= n; int t = 0;
    for(int i = 1; i <= n; i++){
        if(a[i] > sum) t += a[i] - sum;
        else if(a[i] + t < sum) return false;
        else{
            t -= sum - a[i];
        }
    }
    return true;
}

signed main(){
    int _; cin >> _; while(_--) cout << (solve() ? "YES" : "NO") << '\n';
    return 0;
}

C. Make Equal Again

显然,找两边最长连续相同段即可,如果相同可以都算上,不同的话算大的一边。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void solve(){
    int n; cin >> n;
    vector <int> a(n+1);
    for(int i = 1; i <= n; i++) cin >> a[i];
    int l = 2, r = n-1;
    while(a[l] == a[l-1]) l++;
    while(a[r] == a[r+1]) r--;
    r = n - r; l--;
    if(a[1] != a[n])
        cout << n - max(l, r) << endl;
    else
        cout << max(0, n - l - r) << endl;
}

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

D. Divisible Pairs

这是一个不太好的写法,其实开一个 map <pii, int> 就够同时处理 x x x y y y 了。

由题:

  • ( a i + a j ) m o d    x = 0 (a_i + a_j) \mod x = 0 (ai+aj)modx=0
  • ( a i − a j ) m o d    y = 0 (a_i - a_j) \mod y = 0 (aiaj)mody=0

可以转化为:

  • a i m o d    x = x − a j m o d    x a_i \mod x = x - a_j \mod x aimodx=xajmodx
  • a i m o d    y = a j m o d    y a_i \mod y = a_j \mod y aimody=ajmody
#include <iostream>
#include <vector>
#include <map>

#define int long long

using namespace std;

void solve(){
    int n, x, y; cin >> n >> x >> y;;
    vector <int> a(n+1); 
    map <int, int> mpx; map <int, vector <int> > mpy; 
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) mpy[a[i] % y].emplace_back(a[i]);
    int ans = 0;
    for(auto [_, v] : mpy){
        mpx.clear();
        for(auto i : v){
            ans += mpx[(x - i % x) % x];
            mpx[i % x]++;
        }
    }
    cout << ans << '\n';
}

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

E. Anna and the Valentine’s Day Gift

由于最后答案是判断 x x x 1 0 m 10^m 10m 的大小关系,所以答案取决于长度而非大小。

只考虑长度,容易发现:

  • A n n a \mathcal{Anna} Anna 一次翻转,可以把末尾的 0 0 0 全都去掉,对答案的贡献取决于末尾 0 0 0 的长度。
  • S a s h a \mathcal{Sasha} Sasha 一次合并,并不影响其长度之和,但会把 xxx00 合并到 xxxxx 前面变成 xxx00xxxxx,这样 A n n a \mathcal{Anna} Anna 就没办法去掉这个 0 0 0

所以,我们只需要按末尾 0 0 0 的个数从大到小排序,将 A n n a \mathcal{Anna} Anna 能去掉的 0 0 0 去掉,剩下的数字个数即为答案。

#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <string>

#define int long long

using namespace std;

struct item{
    string s;
    int z;
};

void solve(){
    int n, m; cin >> n >> m;
    vector <item> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i].s;
        int p = a[i].s.size() - 1;
        while(a[i].s[p] == '0') p--;
        a[i].z = a[i].s.size() - p - 1;
    }
    sort(a.begin(), a.end(), [](item x, item y){ return x.z > y.z; });
    int cnt = 0, sum = 0;
    for(int i = 0; i < n; i++){
        sum += a[i].s.size();
        if(!(i & 1)) cnt += a[i].z;
    }
    cout << (sum - cnt > m ? "Sasha" : "Anna") << '\n';
}

signed main(){
    int _; cin >> _; while(_--) solve();
    return 0;
}

F. Chat Screenshots

由于每次只是把截图的人拉到了首位,所以 [ 2 , n ] [2, n] [2,n] 区间内是按照原先顺序的。

容易想到拓扑排序的做法,我们只需要对 [ 2 , n ] [2, n] [2,n] 区间内相邻的数建边,再跑拓扑排序判环即可。

另外,由于题目中提到 n ⋅ k ≤ 2 × 1 0 5 n \cdot k \le 2 \times 10^5 nk2×105,所以建图的复杂度是正确的。

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

bool solve(){
    int n, k; cin >> n >> k;
    vector <int> inc(n+1);
    vector < vector <int> > e(n+1);
    for(int i = 1; i <= k; i++){
        vector <int> inp(n);
        for(auto &x : inp) cin >> x;
        for(int j = 1; j < n - 1; j++){
            e[inp[j]].emplace_back(inp[j+1]);
            inc[inp[j+1]]++;
        }
    }
    queue <int> q; int cnt = 0;
    for(int i = 1; i <= n; i++){
        if(!inc[i]){
            q.emplace(i);
        }
    }
    while(!q.empty()){
        int u = q.front(); q.pop();
        cnt++;
        for(auto v : e[u]){
            if(--inc[v] == 0){
                q.emplace(v);
            }
        }
    }
    return cnt == n;
}

int main(){
    int _; cin >> _; while(_--) cout << (solve() ? "YES" : "NO") << '\n';
    return 0;
}
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值