結果
| 問題 | No.3558 Dominoes, Black and White |
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 2026-05-29 20:25:35 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 13 ms / 2,000 ms |
| コード長 | 1,310 bytes |
| 記録 | |
| コンパイル時間 | 1,012 ms |
| コンパイル使用メモリ | 198,420 KB |
| 実行使用メモリ | 10,368 KB |
| 最終ジャッジ日時 | 2026-05-29 20:25:45 |
| 合計ジャッジ時間 | 6,278 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge3_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点 | 10 % | AC * 30 |
| 満点 | 90 % | AC * 89 |
| 合計 | 100 点 |
ソースコード
use proconio::{input, marker::Chars};
fn main() {
input! {
n: usize,
s: [Chars; n],
}
let calc = |l: usize, r: usize| r * r.saturating_sub(1) / 2 - l * l.saturating_sub(1) / 2;
let mut ans = 0usize;
let mut count = vec![];
for s in &s {
let mut cnt = 0usize;
let mut sum = 0;
for j in 0..2 * n {
if s[j] == '.' {
cnt += 1;
sum += j;
}
}
ans += sum - calc(0, cnt);
count.push(cnt);
}
for i in 0..n {
if count[i] == n {
continue;
}
while count[i] > n {
let j = (i..n).find(|&j| count[j] < n).unwrap();
let c = (count[i] - n).min(n - count[j]);
let cost = (j - i) * c + calc(count[i] - c, count[i]) - calc(count[j], count[j] + c);
ans += cost;
count[i] -= c;
count[j] += c;
}
while count[i] < n {
let j = (i..n).find(|&j| count[j] > n).unwrap();
let c = (count[j] - n).min(n - count[i]);
let cost = (j - i) * c + calc(count[j] - c, count[j]) - calc(count[i], count[i] + c);
ans += cost;
count[i] += c;
count[j] -= c;
}
}
println!("{ans}");
}
urectanc