1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ABC406】AtCoder Beginner Contest 406【C++】

Posted at

コンテスト名

パナソニックグループ プログラミングコンテスト2025(AtCoder Beginner Contest 406)

コンテストURL

開催日

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


A: Not Acceptable

解法

  • 時刻を整数に変換して考える
    • $A \times 100 + B > C \times 100 + D$
ABC406A.cpp
#include <iostream>
using namespace std;

int main(){
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    if(a*100+b>c*100+d){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

    return 0;
}

B: Product Calculator

解法

  • オーバーフローに注意し、積算の判定を徐算の判定に置き換える
ABC406B.cpp
#include <iostream>
#include <vector>
using namespace std;

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

    vector<long long int> A(n);
    for(int i=0; i<n; i++){
        cin >> A[i];
    }

    long long int maxk = 1;
    for(int i=0; i<k; i++){
        maxk *= 10;
    }

    long long int ans = 1;
    for(int i=0; i<n; i++){
        if(A[i]>(maxk-1)/ans){
            ans = 1;
        }else{
            ans *= A[i];
        }
    }

    cout << ans << endl;

    return 0;
}

C: ~

解法

  • ランレングス圧縮
  • 「大なり $>$ 」のかたまりの左隣と右隣に「小なり $<$ 」がそれぞれいくつ連なっているかを数える
ABC406C.cpp
#include <iostream>
#include <vector>
using namespace std;

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

    vector<int> P(n);
    for(int i=0; i<n; i++){
        cin >> P[i];
    }

    vector<int> V(n-1);
    for(int i=0; i<n-1; i++){
        if(P[i]<P[i+1]){
            V[i] = 1;
        }else if(P[i]>P[i+1]){
            V[i] = 2;
        }
    }

    vector<pair<int, int>> L;
    for(int i=0; i<n-1; i++){
        if(L.size()==0){
            L.emplace_back(V[i], 1);
        }else{
            if(L.back().first==V[i]){
                L.back().second++;
            }else{
                L.emplace_back(V[i], 1);
            }
        }
    }

    long long int sum = 0;
    for(int i=0; i<L.size(); i++){
        long long int l = 0, r = 0;
        auto [num, cnt] = L[i];

        if(num==2 && i>0 && i<L.size()-1 && L[i-1].first==1 && L[i+1].first==1){
            l = L[i-1].second;
            r = L[i+1].second;
            sum += (l * r);
        }
    }

    cout << sum << endl;

    return 0;
}

D: Garbage Removal

解法

  • vector<set<int>> で各行・各列のゴミを管理する
  • erase()clear() でゴミを取り除く
ABC406D.cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main(){
    int h, w, n;
    cin >> h >> w >> n;

    vector<set<int>> X(h), Y(w);
    int x, y;
    for(int i=0; i<n; i++){
        cin >> x >> y;
        x--;
        y--;
        X[x].insert(y);
        Y[y].insert(x);
    }

    int q, num, z;
    cin >> q;
    for(int i=0; i<q; i++){
        cin >> num >> z;
        z--;
        if(num==1){
            cout << X[z].size() << '\n';

            for(auto a : X[z]){
                Y[a].erase(z);
            }

            X[z].clear();
        }else if(num==2){
            cout << Y[z].size() << '\n';

            for(auto a : Y[z]){
                X[a].erase(z);
            }

            Y[z].clear();
        }
    }

    return 0;
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?