Submission #1072817

#TimeUsernameProblemLanguageResultExecution timeMemory
1072817jer033Sprinklers (CEOI24_sprinklers)C++17
3 / 100
58 ms1624 KiB
#include <bits/stdc++.h> using namespace std; vector<int> in_between; bool possible(int K, vector<int> (&sprinks), vector<int> (&flowers)) { int N = sprinks.size(); int M = flowers.size(); int covered = -1; int towater = 0; int i = 0; while (i<N) { if (towater<M) { int loc = sprinks[i]; if (flowers[towater]<loc) { if (flowers[towater] < (loc-K)) return 0; if (((i+1)<N) and (flowers[towater] >= (sprinks[i+1]-K)) and (in_between[i]>0)) { i++; covered = loc+K; } else covered = loc; } else covered = loc+K; while ((towater<M) and (flowers[towater]<=covered)) towater++; } i++; } if (towater==M) return 1; return 0; } /*int seed=525697; int rando(int a, int b) { seed += a; seed = b*seed; seed = (seed*seed*seed + seed*seed*3 + 200*seed*seed*seed*b*seed + a*a*a); seed = abs(seed); int beed = seed%(b-a+1); return a + beed; } void check(int j) { vector<int> spri; vector<int> flow; for (int i=0; i<10000; i++) { int k = rando(8, 170108); spri.push_back(k); if ((rando(1, 2)==1)) { for (int j=0; j<rando(1, 8); j++) flow.push_back(rando(k-8, k)); } else { for (int j=0; j<rando(1, 8); j++) flow.push_back(rando(k, k+8)); } } sort(spri.begin(), spri.end()); sort(flow.begin(), flow.end()); if (!possible(8, spri, flow)) cout << "alert!!!" << j << '\n'; else seed = 7812364+j*j*j*seed+seed*seed+5*seed+(seed%27263); }*/ void report(int K, vector<int> (&sprinks), vector<int> (&flowers)) { cout << K << '\n'; int N = sprinks.size(); int M = flowers.size(); int covered = -1; int towater = 0; int i = 0; while (i<N) { if (towater<M) { int loc = sprinks[i]; if (flowers[towater]<loc) { if (((i+1)<N) and (flowers[towater] >= (sprinks[i+1]-K)) and (in_between[i]>0)) { i++; covered = loc+K; cout << "RL"; } else { covered = loc; cout << 'L'; } } else { covered = loc+K; cout << 'R'; } while ((towater<M) and (flowers[towater]<=covered)) towater++; } else cout << 'R'; i++; } cout << '\n'; } int main() { int N, M; cin >> N >> M; vector<int> sprinks(N); vector<int> flowers(M); for (int i=0; i<N; i++) cin >> sprinks[i]; for (int i=0; i<M; i++) cin >> flowers[i]; if (N==1) { int left = flowers[0]-sprinks[0]; int righ = flowers[M-1]-sprinks[0]; if ((left<0) and (righ>0)) cout << "-1\n"; else { cout << max(abs(left), abs(righ)) << '\n'; if (left<0) cout << "L\n"; else cout << "R\n"; } } else { in_between = vector<int> (N-1, 0); int curr = 0; for (int i=0; i<M; i++) { while (((curr+1)<N) and (flowers[i]>=sprinks[curr+1])) curr++; if (((curr+1)<N) and (flowers[i]>sprinks[curr]) and (flowers[i]<sprinks[curr+1])) in_between[curr]++; } bool tapos = 0; for (int guess = 0; guess<=20; guess++) { if ((!tapos) and possible(guess, sprinks, flowers)) { report(guess, sprinks, flowers); tapos = 1; } } //for (int i=0; i<(N-1); i++) //cout << in_between[i] << '\n'; /*int lo = 0; int hi = 1'000'000'005; while (lo!=hi) { int mid = (lo+hi)/2; if (possible(mid, sprinks, flowers)) hi = mid; else lo = mid+1; } report(lo, sprinks, flowers);*/ } }
#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...