結果
問題 |
No.3050 Prefix Removal
|
ユーザー |
|
提出日時 | 2025-03-07 21:30:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 971 bytes |
コンパイル時間 | 1,346 ms |
コンパイル使用メモリ | 94,908 KB |
実行使用メモリ | 33,208 KB |
最終ジャッジ日時 | 2025-03-07 21:30:57 |
合計ジャッジ時間 | 14,597 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 WA * 45 |
ソースコード
#include <iostream> #include <atcoder/segtree> using namespace std; typedef long long ll; const ll INF = 100000000000000000; using S = std::pair<ll, int>; S op(S a, S b) { return max(a, b); } S e() { return S(-INF, -1); } int main() { int n, k; cin >> n >> k; int a[500005]; for (int i = 0; i < n; i++) { cin >> a[i]; } ll o = 0; for (int i = n - 1; i >= k; i--) { o += a[i]; if (o <= 0) { n = i; o = 0; } } ll s[500005]; s[n] = 0; for (int i = n - 1; i >= 0; i--) { s[i] = s[i + 1] + a[i]; } atcoder::segtree<S, op, e> seg(n); for (int i = 0; i < n; i++) { seg.set(i, S(s[i], i)); } int r = n; ll ans = 0; for (int i = k; i > 1; i--) { int l = seg.prod(i - 1, r).second; ans += (s[l] - s[r]) * i; r = l; } ans += s[0] - s[r]; cout << ans << endl; }