제출 #1269861

#제출 시각아이디문제언어결과실행 시간메모리
1269861MateiKing80Growing Vegetables is Fun 5 (JOI24_vegetables5)C++20
0 / 100
5092 ms69508 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; #define fr first #define sc second const int N = 300005; int mic[N], mare[N], a[N], b[N], n; bool fct(int k) { //iteram dupa numarul de elemente din a bagate in mare //alea mari din a o sa fie in principiu in ala mare deja, acolo merge doar daca numarul luate este >= ceva //alea mici din a trebuie sa fie in ceva interval numarul de numere //same goes for b dar invers vector<pii> lra, lrb; int cst = 0, cdr = -1; for (int i = 0; i < n; i ++) { while (cst < n && mic[cst] < a[i] - k) cst ++; while (cdr < n - 1 && mic[cdr + 1] <= a[i] + k) cdr ++; lra.push_back({cst, cdr}); } cst = 0, cdr = -1; for (int i = 0; i < n; i ++) { while (cst < n && mare[cst] < b[i] - k) cst ++; while (cdr < n - 1 && mare[cdr + 1] <= b[i] + k) cdr ++; lrb.push_back({cst, cdr}); } int mx = n; for (int i = 0; i < n; i ++) { if (abs(mic[i] - b[i]) > k || abs(mare[n - i - 1] - a[n - i - 1]) > k) { mx = i; break; } } //cout << mx << '\n'; if (mx == n) return true; set<pii> la, lb, ra, rb; for (int i = 0; i < n; i ++) { la.insert({lra[i].fr - i, i}); ra.insert({lra[i].sc - i, i}); lb.insert({i - lrb[i].sc, i}); rb.insert({i - lrb[i].fr, i}); // cout << lra[i].fr - i << " " << lra[i].sc - i << '\n'; // cout << i - lrb[i].sc << " " << i - lrb[i].fr << '\n' << '\n'; } for (int i = 0; i <= mx; i ++) { //nr el bagate de a in mare if ((*la.rbegin()).fr <= i && (*lb.rbegin()).fr <= i && (*ra.begin()).fr >= i && (*rb.begin()).fr >= i) return true; la.erase({lra[n - i - 1].fr - n + i + 1, n - i - 1}); ra.erase({lra[n - i - 1].sc - n + i + 1, n - i - 1}); lb.erase({i - lrb[i].sc, i}); rb.erase({i - lrb[i].fr, i}); } return false; } signed main() { cin >> n; for (int i = 0; i < n; i ++) cin >> mic[i]; for (int i = n - 1; i >= 0; i --) cin >> mare[i]; for (int i = 0; i < n; i ++) cin >> a[i]; sort(a, a + n); for (int i = 0; i < n; i ++) cin >> b[i]; sort(b, b + n); int pos1 = -1; for (int pas = 1 << 30; pas; pas >>= 1) if (!fct(pos1 + pas)) pos1 += pas; swap(a, b); int pos2 = -1; for (int pas = 1 << 30; pas; pas >>= 1) if (!fct(pos2 + pas)) pos2 += pas; cout << min(pos1, pos2) + 1 << '\n'; }
#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...