結果
問題 |
No.3282 Photos and Friends
|
ユーザー |
|
提出日時 | 2025-07-12 10:53:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,747 bytes |
コンパイル時間 | 1,558 ms |
コンパイル使用メモリ | 198,300 KB |
実行使用メモリ | 12,672 KB |
最終ジャッジ日時 | 2025-09-20 11:15:21 |
合計ジャッジ時間 | 7,434 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 49 WA * 1 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; ll P, Q; cin >> N >> P >> Q; vector<ll> X(N), A(N), B(N); for(int i = 0; i < N; i++){ cin >> X[i] >> A[i] >> B[i]; } // ステップ1: 各 i の L[i], R[i] を計算 vector<ll> L(N), R(N); ll sumL = 0, sumR = 0, S = 0; for(int i = 0; i < N; i++){ // タイプ2 を使い切るときに残りをタイプ1で補う最小枚数 L[i] = max(0LL, X[i] - B[i]); // タイプ1 上限と X[i] の小さい方 R[i] = min(A[i], X[i]); sumL += L[i]; sumR += R[i]; S += X[i]; } // 総枚数が足りない場合 if (S > P + Q) { cout << "No\n"; return 0; } // ステップ2: タイプ1を渡す合計枚数Tの範囲チェック // 下限: max(sumL, S - Q) // 上限: min(sumR, P) ll lower = max(sumL, S - Q); ll upper = min(sumR, P); if (lower > upper) { cout << "No\n"; return 0; } // ここでは下限を採用 ll T = lower; // ステップ3: 各フレンズにまずL[i]枚ずつ配り、余りKを順次配分 vector<ll> give1(N); ll K = T - sumL; // 追加で配る枚数 for(int i = 0; i < N; i++){ give1[i] = L[i]; ll can_add = R[i] - L[i]; ll add = min(can_add, K); give1[i] += add; K -= add; } // K は必ず 0 になる // ステップ4: タイプ2 枚数は Xi - give1[i] cout << "Yes\n"; for(int i = 0; i < N; i++){ ll give2 = X[i] - give1[i]; cout << give1[i] << " " << give2 << "\n"; } return 0; }