結果
| 問題 | No.3409 How Many Gift Boxes? |
| コンテスト | |
| ユーザー |
tetra4
|
| 提出日時 | 2025-12-03 14:15:48 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,585 bytes |
| 記録 | |
| コンパイル時間 | 3,223 ms |
| コンパイル使用メモリ | 290,240 KB |
| 実行使用メモリ | 32,332 KB |
| 最終ジャッジ日時 | 2025-12-17 21:17:41 |
| 合計ジャッジ時間 | 9,165 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 37 WA * 1 |
ソースコード
#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() {
unordered_map<ll, ll> a, b;
set<ll, greater<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_min = 0, ans_max = 0;
// 最大値を求めるための変数
ll a_high = 0, b_high = 0;
ll used = 0; // 32bit整数に収まらないことに注意
// 高さの降順でループ
for (ll h : unique) {
// 最小値
ans_min += h * max(a[h], b[h]);
// 最大値
a_high += a[h];
b_high += b[h];
ans_max += h * (a_high * b_high - used);
used = a_high * b_high;
}
cout << ans_min.val() << "\n";
cout << ans_max.val() << "\n";
}
int main() {
input();
solve();
return 0;
}
tetra4