接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

Judge System Update Test Contest 202004

atcoder.jp

ジャッジシステムアップデート!
c++17をようやく使い始めることになりそう(構造化束縛が今の所一番うれしいかな)

A - Walking Takahashi

FA狙おうとしたけど読解でぐだって終わり
最初にいる地点で場合分け
c++17だとclamp使う向け問題っぽい
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int S, L, R;
    cin >> S >> L >> R;
    if(S < L) cout << L << endl;
    else if(R < S) cout << R << endl;
    else cout << S << endl;
}

B - Picking Balls

pairでソートが想定かなあと思いつつもRとBに分けて別々にソートした
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    vector<int> B, R;
    REP(i,N){
        int X;
        char c;
        cin >> X >> c;
        if(c == 'B') B.push_back(X);
        else R.push_back(X);
    }
    sort(B.begin(), B.end());
    sort(R.begin(), R.end());
    for(auto x : R) cout << x << endl;
    for(auto x : B) cout << x << endl;
}

C - Numbering Blocks

これ難しい
最初数学できるかなって10分くらい考えてたけど全然わからなかった(フック長の定理が使えるとかなんとか)
要素が最大でも9個までなのでnext_permutationで全探索して条件を満たすものを数えればいい
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int a1, a2, a3;
    cin >> a1 >> a2 >> a3;
    ll ans = 0;
    vector<int> perm(a1+a2+a3);
    iota(perm.begin(), perm.end(), 1);
    do{
        vector<vector<int>> X(3);
        REP(i,a1) X[0].push_back(perm[i]);
        REP(i,a2) X[1].push_back(perm[i+a1]);
        REP(i,a3) X[2].push_back(perm[i+a1+a2]);
        bool ok = true;
        REP(i,3){
            for(int j=0;j+1<X[i].size();j++){
                if(X[i][j] > X[i][j+1]) ok = false;
            }
        }
        REP(i,2){
            for(int j=0;j<min(X[i].size(), X[i+1].size());j++){
                if(X[i][j] > X[i+1][j]) ok = false;
            }
        }
        if(ok) ans++;
    }while(next_permutation(perm.begin(), perm.end()));
    cout << ans << endl;
}

D - Calculating GCD

これ好き、平成ABC-Dっぽい感じ?
累積GCDを取った配列に対し、S_iごとににぶたんして上げる
 r = Nになったときだけ1にならないので、最後の要素とのGCDを出力、それ以外はr+1を出力
提出コード

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N, Q;
    cin >> N >> Q;
    vector<ll> A(N);
    REP(i,N){
        cin >> A[i];
        if(i > 0){
            A[i] = gcd(A[i-1], A[i]);
        }
    }

    REP(i,Q){
        ll S;
        cin >> S;
        int l = -1, r = N;
        while(r - l > 1){
            int m = (l + r) >> 1;
            if(gcd(A[m], S) > 1) l = m;
            else r = m;
        }
        if(r == N) cout << gcd(S, A[N-1]) << endl;
        else cout << r + 1 << endl;
    }
}

おわりに

unratedコンは気軽で楽しいね
緊張感あるratedも楽しいけど気兼ねなく楽しめるっていい