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 件のコメント:
コメントを投稿