結果
| 問題 | No.3409 How Many Gift Boxes? |
| コンテスト | |
| ユーザー |
tetra4
|
| 提出日時 | 2025-12-03 14:01:09 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 313 ms / 2,000 ms |
| コード長 | 1,767 bytes |
| 記録 | |
| コンパイル時間 | 2,960 ms |
| コンパイル使用メモリ | 300,068 KB |
| 実行使用メモリ | 31,996 KB |
| 最終ジャッジ日時 | 2025-12-17 21:17:45 |
| 合計ジャッジ時間 | 8,929 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 38 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/modint>
using namespace atcoder;
using ll = int64_t;
using mint = modint1000000007;
int H, W;
vector<ll> A, B;
void input() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> H >> W;
assert(H >= 1 && H <= 100000);
assert(W >= 1 && W <= 100000);
A.resize(H);
for (ll i=0; i<H; ++i) {
cin >> A[i];
assert(A[i] >= 0 && A[i] <= 1000000000);
}
B.resize(W);
for (ll j=0; j<W; ++j) {
cin >> B[j];
assert(B[j] >= 0 && B[j] <= 1000000000);
}
// 積み重ね方が存在する条件は max(A)=max(B)
assert(*max_element(A.begin(), A.end()) == *max_element(B.begin(), B.end()));
}
void solve_min() {
unordered_map<ll, ll> a, b;
unordered_set<ll> unique;
for (ll i=0; i<H; ++i) {
++a[A[i]];
unique.insert(A[i]);
}
for (ll j=0; j<W; ++j) {
++b[B[j]];
unique.insert(B[j]);
}
mint ans = 0;
for (ll h : unique) {
ans += h * max(a[h], b[h]);
}
cout << ans.val() << "\n";
}
void solve_max() {
// 降順ソート
sort(A.rbegin(), A.rend());
sort(B.rbegin(), B.rend());
// 番兵を挿入
A.push_back(-1);
B.push_back(-1);
// 尺取り法
vector<ll> a(H), b(W);
ll ia = 0, ib = 0;
while (ia < H || ib < W) {
if (A[ia] <= B[ib]) {
b[ib] = ia;
++ib;
} else {
a[ia] = ib;
++ia;
}
}
mint ans = 0;
for (ll i=0; i<H; ++i) {
ans += a[i] * A[i];
}
for (ll j=0; j<W; ++j) {
ans += b[j] * B[j];
}
cout << ans.val() << "\n";
}
int main() {
input();
solve_min();
solve_max();
return 0;
}
tetra4