Codeforces Round #654 (Div. 2) 感想
Dashboard - Codeforces Round #654 (Div. 2) - Codeforces
感想
🥺
惜しかった~~
今回は界隈で有名な物理好きさん(@butsurizuki)がwriterでした。
いや~すごいな~。僕がwriterなんかしたらコンテスト中は怒りのclarが2兆個飛んできて、 コンテスト後はwriter解に穴が5京個見つかり競プロ界から永久BANされそう。
日本人writerということもあってか、僕のフレンド(一方的)も温まっている方が多い感じがする。
A - Magical Sticks
が偶数の時は 、奇数の時は に揃えるのが一番いいだろうという直感を信じ提出するとACを得た。
提出コード
void solve() {
int Q;
cin >> Q;
while (Q--) {
ll N;
cin >> N;
cout << (N + 1) / 2 << "\n";
}
}
B - Magical Calendar
色々試すと、 の時は 、の時は が答えだということが分かった。
横幅で分類して整理するのがポイントかもしれない。後のCやDより難しく感じた。
提出コード
void solve() {
int Q;
cin >> Q;
while (Q--) {
ll N, R;
cin >> N >> R;
ll b;
if (R < N) {
b = R * (R + 1) / 2;
}
else {
b = N * (N - 1) / 2 + 1;
}
cout << b << "\n";
}
}
C - A Cookie for You
type2(逆張り)の人を怒らせないように頑張れば良さそうで、そうなると が条件となる。
あと、もちろん全員がクッキーにありつけるための条件 も要る。
div2-Cにしては簡単で、逆に「なにか見落としてるんちゃうか......」とか言って時間を無駄に消費してしまった。ダメだなぁ。
提出コード
void solve() {
int Q;
cin >> Q;
while (Q--) {
ll A, B, N, M;
cin >> A >> B >> N >> M;
bool ok = true;
if (M > min(A, B)) {
ok = false;
}
if (A + B < M + N) {
ok = false;
}
cout << (ok ? "YES\n" : "NO\n");
}
}
D - Grid-00100
の時は、下のようにすれば行も列も1の個数の差を0にできる。
そうでないときは、行も列も個数の差を0にするのは不可能だが、このときも下のようにすれば行も列も個数の差を1に抑えることができる。
はじめに、各列に 個ずつ1を入れる。このとき、
みたいに列ごとに1つずつ下にずらしながら1を入れると、各行に入る1の個数も になる。
そして、余りの 個の1を に入れていけば良い。
提出コード
void solve() {
int Q;
cin >> Q;
int cell[301][301];
while (Q--) {
ll N, K;
cin >> N >> K;
for (ll i = 0; i < N; i++) {
for (ll j = 0; j < N; j++) {
cell[i][j] = 0;
}
}
ll a = K / N;
ll b = K % N;
for (ll i = 0; i < N; i++) {
for (ll j = 0; j < a; j++) {
cell[i][(i + j) % N] = 1;
}
}
for (ll i = 1; i <= b; i++) {
cell[i][i - 1] = 1;
}
ll score;
if (b == 0) {
score = 0;
}
else {
score = 2;
}
cout << score << "\n";
for (ll i = 0; i < N; i++) {
for (ll j = 0; j < N; j++) {
cout << cell[i][j];
}
cout << "\n";
}
}
}
E1 - Asterism (Easy Version)
まず、数列 をソートしておく。
の値は、 の大きい から、 を割り当てて行くことを考えれば求められる。 各 について 割り当てられる の値が何通りずつあるかを調べて(これを とおく)、それらを掛け合わせれば となる。
知りたいのは が素数 で割り切れるかどうかだから、実際に を求める必要はなくて、 の素因数に が含まれるかどうかを調べればいい。さらに、 は必ずある整数 の階乗 になるので、 が 以上であるかどうかのみを調べればいい。
提出コード
void solve() {
ll N, P;
cin >> N >> P;
Vl A(N);
for (ll i = 0; i < N; i++) {
cin >> A[i];
}
sort(A.begin(), A.end(), greater<ll>());
Vi ans;
for (ll x = 0; x <= 2000; x++) {
bool ok = true;
ll mr = x + N;
ll cnt = 0;
for (ll i = 0; i < N; i++) {
ll r = mr - max(A[i], x) - cnt;
if (r == P || r <= 0) {
ok = false;
break;
}
else {
++cnt;
}
}
if (ok) {
ans.emplace_back(x);
}
}
cout << ans.size() << "\n";
for (const auto& ai : ans) {
cout << ai << " ";
}
cout << "\n";
}
E2 - Asterism (Hard Version)
解けなかった。
時間ギリギリに 条件を満たす が区間になりそうだということが何となく分かったので惜しかった(適当)
F- Raging Thunder
問題を見ていません......