結果
問題 | No.1568 Sushi |
ユーザー | SSRS |
提出日時 | 2021-06-26 14:55:43 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,738 bytes |
コンパイル時間 | 3,041 ms |
コンパイル使用メモリ | 218,432 KB |
実行使用メモリ | 36,596 KB |
最終ジャッジ日時 | 2024-06-25 10:42:48 |
合計ジャッジ時間 | 16,433 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
12,192 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | TLE | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
ソースコード
#define _GLIBCXX_DEBUG #include <bits/stdc++.h> using namespace std; const long long INF = 100000000000000000; struct monoid{ bool id; long long mn, mx, inc, dec; monoid(){ id = true; } monoid(long long L, long long R){ id = false; mn = min(L, R); mx = max(L, R); inc = max(R - L, (long long) 0); dec = min(R - L, (long long) 0); } }; monoid f(monoid L, monoid R){ if (L.id){ return R; } if (R.id){ return L; } monoid ans; ans.id = false; ans.mn = min(L.mn, R.mn); ans.mx = max(L.mx, R.mx); ans.inc = max({L.inc, R.inc, R.mx - L.mn}); ans.dec = min({L.dec, R.dec, R.mn - L.mx}); return ans; } struct segment_tree{ int N; vector<long long> A; vector<long long> S; vector<monoid> ST; segment_tree(vector<long long> A2): A(A2){ A.push_back(INF); int N2 = A.size(); S = vector<long long>(N2 + 1); long long P = 0; S[0] = 0; for (int i = 0; i < N2; i++){ if (i % 2 == 0){ S[i + 1] = S[i] + (A[i] - P); } else { S[i + 1] = S[i] - (A[i] - P); } P = A[i]; } N = 1; while (N < N2){ N *= 2; } ST = vector<monoid>(N * 2 - 1); for (int i = 0; i < N2; i++){ ST[N - 1 + i] = monoid(S[i], S[i + 1]); } for (int i = N - 2; i >= 0; i--){ ST[i] = f(ST[i * 2 + 1], ST[i * 2 + 2]); } } monoid range_fold(int L, int R, int i, int l, int r){ if (r <= L || R <= l){ return monoid(); } else if (L <= l && r <= R){ return ST[i]; } else { int m = (l + r) / 2; return f(range_fold(L, R, i * 2 + 1, l, m), range_fold(L, R, i * 2 + 2, m, r)); } } monoid range_fold(int L, int R){ return range_fold(L, R, 0, 0, N); } monoid query(long long tL, long long tR){ int L = lower_bound(A.begin(), A.end(), tL) - A.begin(); int R = lower_bound(A.begin(), A.end(), tR) - A.begin() - 1; if (R == L - 1){ if (L % 2 == 0){ return monoid(S[L + 1] - (A[L] - tL), S[L + 1] - (A[L] - tR)); } else { return monoid(S[L + 1] + (A[L] - tL), S[L + 1] + (A[L] - tR)); } } monoid l; if (L % 2 == 0){ l = monoid(S[L + 1] - (A[L] - tL), S[L + 1]); } else { l = monoid(S[L + 1] + (A[L] - tL), S[L + 1]); } monoid m = range_fold(L + 1, R + 1, 0, 0, N); monoid r; if (R % 2 == 0){ r = monoid(S[R + 1], S[R + 1] - (tR - A[R])); } else { r = monoid(S[R + 1], S[R + 1] + (tR - A[R])); } monoid ans = f(f(l, m), r); return ans; } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); long long L; int N, Q; cin >> L >> N >> Q; vector<long long> A(N); for (int i = 0; i < N; i++){ cin >> A[i]; } segment_tree ST(A); long long D = 0; for (int i = 0; i < Q; i++){ long long B, C; cin >> B >> C; long long x, t; if (i == 0){ x = B; t = C; } else { x = (B + D) % L; t = (C + D) % 1000000000000000; } int l = lower_bound(A.begin(), A.end(), t) - A.begin(); monoid M = ST.query(t, ST.A[l]); if (M.inc >= x || M.dec <= -L + x){ long long d = max(M.inc - x, (-L + x) - M.dec); D = ST.A[l] - d; } else { int fv = l, tv = N; while (tv - fv > 1){ int mid = (tv + fv) / 2; M = ST.range_fold(l + 1, mid + 1); if (M.inc >= x || M.dec <= -L + x){ tv = mid; long long d = max(M.inc - x, (-L + x) - M.dec); D = ST.A[mid] - d; } else { fv = mid; } } if (tv == N){ M = ST.query(t, INF / 10); long long d = max(M.inc - x, (-L + x) - M.dec); D = INF / 10 - d; } } D -= t; cout << D << "\n"; } }