0
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?

【ABC377】AtCoder Beginner Contest 377【C++】

Posted at

コンテスト名

トヨタシステムズプログラミングコンテスト2024(AtCoder Beginner Contest 377)

コンテストURL

開催日

2024/10/26 21:00-22:40


A: Rearranging ABC

解法

  • 文字列を昇順にソートして ABC と一致するか判定する
ABC377A.cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main(){
    string s;
    cin >> s;
    
    sort(s.begin(), s.end());

    if(s=="ABC"){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }

    return 0;
}

B: Avoid Rook Attack

解法

  • コマが一つも置かれていない列数と行数の積が求める答えである
ABC377B.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    vector<string> G(8);
    for(int i=0; i<8; i++){
        cin >> G[i];
    }

    int cnt1 = 0, cnt2 = 0;
    for(int i=0; i<8; i++){
        bool flag1 = true, flag2 = true;
        for(int j=0; j<8; j++){
            if(G[i][j]=='#'){
                flag1 = false;
            }
            if(G[j][i]=='#'){
                flag2 = false;
            }
        }
        if(flag1){
            cnt1++;
        }
        if(flag2){
            cnt2++;
        }
    }

    cout << cnt1 * cnt2 << endl;

    return 0;
}

C: Avoid Knight Attack

解法

  • コマが置かれているマスとコマが移動できるマスを set<pair<int, int>> に記録する
  • マス数 $N^2$ からコマが置かれているマスとコマが移動できるマスの合計を引いた数が求める答えである
ABC377C.cpp
#include <iostream>
#include <set>
#include <cmath>
using namespace std;

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

    set<pair<int, int>> S;
    int a, b;
    int cnt = 0;
    for(int i=0; i<m; i++){
        cin >> a >> b;
        S.insert({a, b});

        for(int j=-2; j<=2; j++){
            for(int k=-2; k<=2; k++){
                if(j==0 || k==0 || abs(j)==abs(k)){
                    continue;
                }
                if(abs(j)==abs(k)){
                    continue;
                }
                if(a+j<1 || a+j>n || b+k<1 || b+k>n){
                    continue;
                }

                S.insert({a+j, b+k});
            }
        }
    }

    
    cout << n*n - S.size() << endl;

    return 0;
}

D: Many Segments 2

解法

  • 区間の右端を固定して条件を満たす左端の個数を数える
  • 各右端について、最も大きい左端を vector<int> に記録しておく
ABC377D.cpp
#include <iostream>
#include <vector>
using namespace std;

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

    vector<int> V(m+1);
    int l, r;
    for(int i=0; i<n; i++){
        cin >> l >> r;
        if(V[r]<l){
            V[r] = l;
        }
    }

    for(int i=1; i<=m; i++){
        if(V[i]<V[i-1]){
            V[i] = V[i-1];
        }
    }

    long long int cnt = 0;
    for(int i=1; i<=m; i++){
        cnt += i - V[i];
    }

    cout << cnt << endl;

    return 0;
}
0
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
0
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?