結果
| 問題 |
No.459 C-VS for yukicoder
|
| コンテスト | |
| ユーザー |
tubo28
|
| 提出日時 | 2016-12-04 19:23:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 21 ms / 2,000 ms |
| コード長 | 1,731 bytes |
| コンパイル時間 | 1,871 ms |
| コンパイル使用メモリ | 176,080 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-28 19:52:23 |
| 合計ジャッジ時間 | 4,334 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 58 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void validate_range(int x, int l, int r) { assert(l <= x && x <= r); }
int H, W, N;
vector<string> S;
int C[30010]; // パックiが置かれた列
int need[10010]; // i列目に必要なブロックの数
vector<int> pack[10010]; // i列目に置かれたパックの集合
int cnt[30010]; // パックiが含むブロックの数
int cntc[30010][3]; // パックiがj列目に含むブロックの数
int main() {
cin >> H >> W >> N;
validate_range(H, 1, 10000);
validate_range(W, 3, 10000);
validate_range((ll)H * W, 3, 30000);
validate_range(N, 1, max(H * W, 30000));
S.assign(H, "");
for (int i = 0; i < H; ++i) {
cin >> S[i];
validate_range(S[i].size(), W, W);
}
for (int j = 0; j < W; ++j)
for (int i = 0; i < H; ++i)
if (S[i][j] == '#')
++need[j];
validate_range(accumulate(need, need + W, 0), 1, H * W);
for (int i = 0; i < N; ++i) {
cin >> C[i];
validate_range(C[i], 0, W - 3);
for (int j = 0; j < 3; ++j)
pack[C[i] + j].push_back(i);
}
for (int j = 0; j < W; ++j) {
auto &ps = pack[j];
sort(ps.begin(), ps.end(), [&](int a, int b) {
return cnt[a] != cnt[b] ? cnt[a] < cnt[b] : C[a] < C[b];
});
int jj = 0;
while (jj < need[j]) {
int p = ps[jj % ps.size()];
int rj = j - C[p];
if (cntc[p][rj] == 3)
continue;
++cnt[p];
++cntc[p][rj];
++jj;
}
}
for (int x = 0; x < N; ++x) {
char ans[3][4] = {"...", "...", "..."};
for (int j = 0; j < 3; ++j)
for (int i = 0; i < cntc[x][j]; ++i)
ans[i][j] = '#';
for (int i = 0; i < 3; ++i)
puts(ans[i]);
}
}
tubo28