🔵

【ABC436】AtCoder Beginner Contest 436【C++】

に公開

コンテスト名

AtCoder Beginner Contest 436

コンテストURL

https://atcoder.jp/contests/abc436/

開催日

2025/12/13 21:00–22:40


A: o-padding

解法

  • 問題文通りに操作する
ABC436A.cpp
#include <iostream>
#include <string>
using namespace std;

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

    for(int i=0; i<n-s.size(); i++){
        cout << 'o';
    }
    cout << s << endl;

    return 0;
}

B: Magic Square

解法

  • 問題文通りに操作する
ABC436B.cpp
#include <iostream>
#include <vector>
using namespace std;

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

    vector<vector<int>> G(n, vector<int>(n, -1));

    G[0][(n-1)/2] = 1;
    int r = 0, c = (n - 1) / 2, k = 1;
    for(int i=0; i<n*n-1; i++){
        if(G[(r-1+n)%n][(c+1)%n]==-1){
            r = (r - 1 + n) % n;
            c = (c + 1) % n;
        }else{
            r = (r + 1) % n;
        }

        G[r][c] = k + 1;
        k = k + 1;
    }

    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(j){
                cout << " ";
            }
            cout << G[i][j];
        }
        cout << '\n';
    }

    return 0;
}

C: 2x2 Placing

解法

  • set<pair<int, int>> にブロックが置かれているマスの位置を記録する
ABC436C.cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;

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

    set<pair<int, int>> S;
    int r, c;
    vector<int> dr = {0, 0, 1, 1}, dc = {0, 1, 0, 1};
    int cnt = 0;
    for(int i=0; i<m; i++){
        cin >> r >> c;

        bool flag = true;
        for(int i=0; i<4; i++){
            int nr = r + dr[i], nc = c + dc[i];
            if(S.count(make_pair(nr, nc))){
                flag = false;
                break;
            }
        }

        if(flag){
            cnt++;
            for(int i=0; i<4; i++){
                int nr = r + dr[i], nc = c + dc[i];
                S.emplace(nr, nc);
            }
        }
    }

    cout << cnt << endl;

    return 0;
}

Discussion