제출 #1164550

#제출 시각아이디문제언어결과실행 시간메모리
1164550cpismylifeOwOGarden (JOI23_garden)C++20
15 / 100
315 ms51672 KiB
#include <bits/stdc++.h> using namespace std; const long long mod = 1e9 + 7; const int MaxN = 1e6 + 5; int n, m, d; pair<int, int> a[MaxN]; pair<int, int> b[MaxN]; void Inp() { cin >> n >> m >> d; for (int x = 1; x <= n; x++) { cin >> a[x].first >> a[x].second; } for (int x = 1; x <= m; x++) { cin >> b[x].first >> b[x].second; } sort(b + 1, b + m + 1); } int cnt[MaxN]; int mrka[MaxN]; vector<int> mrkb[MaxN]; int pre[MaxN]; vector<int> now[MaxN]; int ptr[MaxN]; int prevv[MaxN]; int nxt[MaxN]; void Exc() { for (int x = 1; x <= n; x++) { cnt[a[x].first]++; cnt[a[x].first + d]++; mrka[a[x].second]++; } for (int x = 1; x <= m; x++) { mrkb[b[x].second].push_back(b[x].first); } for (int x = 0; x < d; x++) { pre[x] = 2 * d; ptr[x] = 0; if (!mrkb[x].empty()) { pre[x] = mrkb[x].back(); mrkb[x].push_back(*mrkb[x].begin() + d); } } int res = d * d; for (int x1 = 0; x1 < d; x1++) { for (int x = 0; x < d; x++) { now[x].clear(); } for (int x = 0; x < d; x++) { if (pre[x] < 2 * d) { now[pre[x]].push_back(x); } } for (int x = 0; x < d; x++) { prevv[x] = x - 1; nxt[x] = x + 1; } int cur = 1, cursum = 0, fi = 0, ls = d - 1; for (int x = 0; x < d; x++) { if (pre[x] >= 2 * d && mrka[x] == 0) { int p = prevv[x], q = nxt[x]; if (p >= 0) { nxt[p] = q; } else { fi = q; } if (q < d) { prevv[q] = p; } else { ls = p; } if (p >= 0 && q < d) { cur = max(cur, q - p); } } } if (ls < fi) { cur = 0; } if (cursum == n) { res = min(res, d + 1 - cur); res = min(res, (ls - fi + 1)); } for (int x2 = x1; x2 < x1 + d; x2++) { cursum += cnt[x2]; for (int x : now[x2]) { if (mrka[x] == 0) { int p = prevv[x], q = nxt[x]; if (p >= 0) { nxt[p] = q; } else { fi = q; } if (q < d) { prevv[q] = p; } else { ls = p; } if (p >= 0 && q < d) { cur = max(cur, q - p); } } } if (ls < fi) { cur = 0; } if (cursum == n) { res = min(res, (x2 - x1 + 1) * (d + 1 - cur)); res = min(res, (x2 - x1 + 1) * (ls - fi + 1)); } } for (int x = 0; x < d; x++) { if (!mrkb[x].empty() && mrkb[x][ptr[x]] <= x1) { pre[x] = mrkb[x][ptr[x]] + d; ptr[x]++; } } } cout << res; } int main() { //freopen("C.INP", "r", stdin); //freopen("C.OUT", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(nullptr); int test = 1; //cin >> test; for (int w = 1; w <= test; w++) { Inp(); Exc(); } 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...