🔵

【ABC413】AtCoder Beginner Contest 413【C++】

に公開

コンテスト名

デンソークリエイトプログラミングコンテスト2025(AtCoder Beginner Contest 413)

コンテストURL

https://atcoder.jp/contests/abc413

開催日

2025/07/05 21:00–22:40


A: Content Too Large

解法

  • 問題文通りに判定する
ABC413A.cpp
#include <iostream>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;

    int sum = 0;
    int a;
    for(int i=0; i<n; i++){
        cin >> a;
        sum += a;
    }

    if(sum<=m){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

    return 0;
}

B: cat 2

解法

  • set<string> で連結した結果の文字列を管理する
ABC413B.cpp
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;

int main(){
    int n;
    cin >> n;

    string s;
    vector<string> V;
    for(int i=0; i<n; i++){
        cin >> s;
        V.push_back(s);
    }

    set<string> S;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(i==j){
                continue;
            }

            string t = V[i] + V[j];
            S.insert(t);
        }
    }

    cout << S.size() << endl;

    return 0;
}

C: Large Queue

解法

  • queue<pair<long long int, long long int>>xc の組を管理する
ABC413C.cpp
#include <iostream>
#include <queue>
using namespace std;

int main(){
    int q;
    cin >> q;

    queue<pair<long long int, long long int>> Q;
    long long int num, c, x, k;
    int idx = 0;
    for(int i=0; i<q; i++){
        cin >> num;

        if(num==1){
            cin >> c >> x;
            Q.emplace(x, c);
        }else if(num==2){
            cin >> k;
            long long int sum = 0;
            while(k!=0){
                auto [x, c] = Q.front();
                if(k>=c){
                    sum += x * c;
                    k -= c;
                    Q.pop();
                }else{
                    sum += x * k;
                    Q.front().second -= k;
                    k = 0;
                }
            }

            cout << sum << '\n';
        }
    }
}

D: Make Geometric Sequence

解法

  • すべての項の絶対値が等しい場合とそれ以外で場合分けする
  • 絶対値の昇順にソートする
  • 等比数列であるとき、 B_i \times B_{i+2} = {B_{i+1}}^2 が成り立つ
ABC413D.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

int main(){
    int t;
    cin >> t;

    while(t--){
        int n;
        cin >> n;

        vector<pair<long long int, long long int>> A;
        int pluscnt = 0, minuscnt = 0;
        set<long long int> S;
        long long int a;
        for(int i=0; i<n; i++){
            cin >> a;

            if(a<0){
                minuscnt++;
                S.insert(-a);
                A.emplace_back(-a, a);
            }else{
                pluscnt++;
                S.insert(a);
                A.emplace_back(a, a);
            }
        }

        bool flag = true;
        if(n>2){
            if(S.size()==1){
                if(pluscnt>0 && minuscnt>0 && min(pluscnt, minuscnt)!=n/2){
                    flag = false;
                }
            }else{
                sort(A.begin(), A.end());
                for(int i=0; i<n-2; i++){
                    if(A[i].second*A[i+2].second!=A[i+1].second*A[i+1].second){
                        flag = false;
                        break;
                    }
                }
            }
        }

        if(flag){
            cout << "Yes" << '\n';
        }else{
            cout << "No" << '\n'; 
        }
    }

    return 0;
}

Discussion