prettify

2016年5月10日火曜日

"AtCoderでじゃんけんを" AtCoder Regular Contest 048 B

AtCoderでじゃんけんを

解法:
配列RとHには、それぞれi番目の人のレートと手を入れていく(0 <= i < N)。
ヴェクターVに各レート・各手の人数を記録する。
レートの小さい方から人数の累積和を取っていく。S[i]はレートがi以下の人数。
出力するときは配列RとHを見ていって、i番目の人の場合は
勝ち数:自分よりレートの低い人の数(S[R[i]-1])+ 自分と同じレートかつ手で勝てる人の数(V[R[i]][(H[i]+1)%3])
負け、引き分けも同様。

// ARC048B
#include <bits/stdc++.h>
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
using namespace std;
int R[100001], H[100001];
vector< vector > V(100001, vector(3,0));

int main() {
    int N;
    cin >> N;
    REP(i,N){
        cin >> R[i] >> H[i];
        H[i]--;
        V[R[i]][H[i]]++;}

    vector S(100001,0);
    for(int i = 1; i < 100001; i++) {
        S[i] += S[i-1] + V[i][0]+V[i][1]+V[i][2];}

    REP(i,N){
        cout << S[R[i]-1] + V[R[i]][(H[i]+1)%3] << " " << N - S[R[i]] + V[R[i]][(H[i]+2)%3] << " " << V[R[i]][H[i]] - 1 << endl;}

    return 0;
}

0 件のコメント:

コメントを投稿