結果
問題 |
No.2860 Heal Slimes
|
ユーザー |
|
提出日時 | 2025-04-18 16:23:34 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,516 bytes |
コンパイル時間 | 2,100 ms |
コンパイル使用メモリ | 197,304 KB |
実行使用メモリ | 9,472 KB |
最終ジャッジ日時 | 2025-04-18 16:23:41 |
合計ジャッジ時間 | 6,560 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 WA * 10 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; // o4-mini-high int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int N, K; ll X; cin >> N >> K >> X; vector<ll> H(N); for (int i = 0; i < N; i++) { cin >> H[i]; } // Special case: can only heal all at once if (K == N) { bool all_eq = true; for (int i = 1; i < N; i++) { if (H[i] != H[0]) { all_eq = false; break; } } cout << (all_eq ? "Yes" : "No") << "\n"; continue; } // Check modulo invariant ll r = H[0] % X; bool ok = true; for (int i = 1; i < N; i++) { if (H[i] % X != r) { ok = false; break; } } if (!ok) { cout << "No\n"; continue; } // Normalize H[i] = X * a[i] + r vector<ll> a(N+1); for (int i = 1; i <= N; i++) { a[i] = (H[i-1] - r) / X; } // Differences vector<ll> d(N+2); for (int i = 2; i <= N; i++) { d[i] = a[i] - a[i-1]; } d[N+1] = -a[N]; int M = N - K + 1; vector<ll> base_op(M+2); base_op[1] = -a[1]; for (int j = 2; j <= M; j++) { if (j <= K) { base_op[j] = -d[j]; } else { base_op[j] = -d[j] + base_op[j - K]; } } // Non-negativity for segments not involving the global shift C for (int j = 1; j <= M; j++) { if ((j - 1) % K != 0 && base_op[j] < 0) { ok = false; break; } } if (!ok) { cout << "No\n"; continue; } // Lower bound on C from non-negativity ll C_min = LLONG_MIN; for (int j = 1; j <= M; j++) { if ((j - 1) % K == 0) { C_min = max(C_min, -base_op[j]); } } // Tail-consistency constraints may fix C exactly int j_low = max(1, N - 2*K + 2); int j_high = N - K; bool C_assigned = false; ll C_val = 0; for (int j = j_low; j <= j_high; j++) { int i = j + K; if ((j - 1) % K == 0) { ll needed = d[i] - base_op[j]; if (!C_assigned) { C_assigned = true; C_val = needed; } else if (C_val != needed) { ok = false; break; } } else { if (base_op[j] != d[i]) { ok = false; break; } } } if (!ok) { cout << "No\n"; continue; } // Ensure final target is ≥ current maximum ll max_a = 0; for (int i = 1; i <= N; i++) { max_a = max(max_a, a[i]); } if (C_assigned) { // Check assigned C meets all lower bounds if (C_val < max_a || C_val < C_min) { cout << "No\n"; } else { cout << "Yes\n"; } } else { // We can pick C = max(max_a, C_min) cout << "Yes\n"; } } return 0; }