結果
問題 |
No.3282 Photos and Friends
|
ユーザー |
![]() |
提出日時 | 2025-10-15 17:36:02 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 132 ms / 2,000 ms |
コード長 | 1,603 bytes |
コンパイル時間 | 3,533 ms |
コンパイル使用メモリ | 279,028 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2025-10-15 17:36:16 |
合計ジャッジ時間 | 12,877 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 50 |
ソースコード
#include <bits/stdc++.h> //#include <atcoder/modint> using namespace std; //using namespace atcoder; using ll = long long; //using mint = modint998244353; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); /* A_i = min(A_i, X_i) B_i = min(B_i, X_i) としておく。 X_i <= A_i+B_iか確認する。 タイプ1をA_iだけ持たせ、タイプ2をX_i-A_i(<=B_i)だけ持たせる。 タイプ1が不足しているならタイプ2とタイプ1を交換。 i人目が交換できる枚数はY_i=min(A_i, B_i-(X_i-A_i))枚。 タイプ1の不足枚数がS枚のとき、タイプ2はS枚以上ある必要があり、sum_i Y_i >= Sでないといけない。 */ ll N, P, Q; cin >> N >> P >> Q; vector<ll> X(N), A(N), B(N), p(N), q(N); for (int i=0; i<N; i++){ cin >> X[i] >> A[i] >> B[i]; A[i] = min(A[i], X[i]); B[i] = min(B[i], X[i]); if (X[i] > A[i]+B[i]){ cout << "No" << endl; return 0; } p[i] = A[i]; q[i] = X[i]-A[i]; P -= p[i]; Q -= q[i]; } if (P < 0){ ll remain=-P; for (int i=0; i<N; i++){ ll z = min(min(A[i], B[i]-(X[i]-A[i])), remain); remain -= z; P += z; Q -= z; p[i] -= z; q[i] += z; } } if (P < 0 || Q < 0){ cout << "No" << endl; return 0; } cout << "Yes" << endl; for (int i=0; i<N; i++) cout << p[i] << " " << q[i] << '\n'; return 0; }