Submission #1036537

#TimeUsernameProblemLanguageResultExecution timeMemory
1036537model_codeSprinklers (CEOI24_sprinklers)C++17
100 / 100
385 ms26768 KiB
// Author: Robert Jaworski #include <bits/stdc++.h> using namespace std; constexpr int DP_RANGE = 3; constexpr int DP_SIZE = 1 << (2 * DP_RANGE); void dp(int N, int M, const vector<int>& s, const vector<int>& f) { vector<int> dir(N, -1); int K = 0; vector<int> dp(DP_SIZE + M*DP_SIZE, -1); auto DP = [&] (int fi, int conf) -> int& { return dp[DP_SIZE + fi * DP_SIZE + conf]; }; auto COVER = [&] (int fi, int si, int conf) { int k = 0x7fffffff; if (si >= 0 && s[si] == f[fi]) return 0; for (int j = 0; j < DP_RANGE; j++) { int i = si-DP_RANGE+1 + j; if (i >= 0 && (conf & (1 << j)) != 0) { k = min(k, f[fi] - s[i]); } } for (int j = DP_RANGE; j < 2*DP_RANGE; j++) { int i = si-DP_RANGE+1 + j; if (i < N && (conf & (1 << j)) == 0) { k = min(k, s[i] - f[fi]); } } return k; }; auto DO_COVER = [&] (int fi, int si, int conf) { for (int j = 0; j < 2*DP_RANGE; j++) { int i = si-DP_RANGE+1 + j; if (0 <= i && i < N) { if (dir[i] != -1 && (dir[i] == 0) != ((conf & (1 << j)) == 0)) { cerr << "Bad cover " << i << " " << s[i] << endl; } dir[i] = conf & (1 << j); } } }; auto PREV = [&] (int fi, int ds, int conf) { if (!ds) return DP(fi-1, conf); int k = 0x7fffffff; for (int c = 0; c < DP_SIZE; c++) { if (ds > 2*DP_RANGE || (c >> ds) == (conf & ((DP_SIZE-1) >> ds))) { k = min(k, DP(fi-1, c)); } } return k; }; for (int fi = 0, si = -1, psi = -1; fi < M; fi++) { while (si + 1 < N && s[si+1] <= f[fi]) si++; for (int conf = 0; conf < DP_SIZE; conf++) { DP(fi, conf) = COVER(fi, si, conf); DP(fi, conf) = max(DP(fi, conf), PREV(fi, si - psi, conf)); } psi = si; } for (int fi = M, si = N-1, c=0, cm=0; fi-- > 0;) { while (si >= 0 && s[si] > f[fi]) { si--; c <<= 1; cm &= cm - 1; } int minK = 0x7fffffff, minC = 0; for (int conf = 0; conf < DP_SIZE; conf++) { if ((conf & cm) == (c & cm)) { if (DP(fi, conf) < minK) { minK = DP(fi, conf); minC = conf; } } } DO_COVER(fi, si, minC); c = minC; cm = DP_SIZE-1; K = max(K, minK); } if (K == 0x7fffffff) { cout << -1 << endl; return; } cout << K << endl; for (auto&& x : dir) { cout << (x ? 'R' : 'L'); } cout << endl; } int main() { int N, M; cin >> N >> M; vector<int> s(N, 0), f(M, 0); for (auto&& x : s) { cin >> x; } for (auto&& x : f) { cin >> x; } dp(N, M, s, f); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...