Submission #935012

#TimeUsernameProblemLanguageResultExecution timeMemory
935012SharkyGarden (JOI23_garden)C++17
0 / 100
757 ms115048 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500500; const int D = 5005; int n, m, d, p[N], q[N], x[N], y[N], cx[D], cy[D], sy[D], px[D], py[D], a[D][D]; vector<int> stupid[D]; queue<int> que[D]; int ans = 1e9; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> d; for (int i = 1; i <= n; i++) { cin >> p[i] >> q[i]; cx[p[i]]++; cy[q[i]]++; } for (int i = 0; i < d; i++) { int totx = 0, toty = 0; for (int j = i; j < i + d; j++) { totx += cx[j % d]; if (totx == n) { px[i] = j - i + 1; break; } } for (int j = i; j < i + d; j++) { toty += cy[j % d]; if (toty == n) { py[i] = j - i + 1; break; } } } // for (int i = 0; i < d; i++) cout << py[i] << ' '; // cout << '\n'; for (int i = 1; i <= m; i++) { cin >> x[i] >> y[i]; // long sy[y[i]]++; stupid[y[i]].push_back(x[i]); } for (int i = 0; i < d; i++) { sort(stupid[i].begin(), stupid[i].end()); stupid[i].erase(unique(stupid[i].begin(), stupid[i].end()), stupid[i].end()); for (auto& stu : stupid[i]) que[i].push(stu); } for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) a[i][j] = d; for (int i = 0; i < d; i++) { int tim = d, j = i; while (tim--) { j++; if (j >= d) j -= d; int di = i + d - j + 1; if (i >= j) di = i - j + 1; a[j][i] = min(a[((j - 1) % d + d) % d][i], max(py[j], di)); // cout << j << ' ' << i << ' ' << a[j][i] << '\n'; } } for (int i = 0; i < d; i++) { vector<vector<int>> cnt(d << 1); vector<int> ll(d, 0), rr(d, 0), hv; int len = d; for (int j = 0; j < d; j++) if (!que[j].empty()) cnt[que[j].front()].push_back(j); // for (int j = 0; j < (d << 1); j++) { // cout << "pt " << j << '\n'; // for (auto& xx : cnt[j]) cout << xx << ' '; // cout << '\n'; // } for (int j = 0; j < d; j++) if (sy[j]) hv.push_back(j); for (int j = 0; j < (int) hv.size(); j++) { int k = (j + 1) % (int) hv.size(); rr[hv[j]] = hv[k]; ll[hv[k]] = hv[j]; len = min(len, a[hv[k]][hv[j]]); } // cout << len << '\n'; int lb = i + px[i] - 1; // cout << "new\n"; for (int j = i; j <= i + d - 1; j++) { // cout << "testing: " << i << ' ' << j << '\n'; for (auto& ys : cnt[j]) { int L = ll[ys], R = rr[ys]; ll[R] = L; rr[L] = R; len = min(len, a[R][L]); // cout << "del: " << ys << '\n'; // cout << "len: " << len << '\n'; // ans = min(ans, (max(lb, j) - i + 1) * len); // cout << i << ' ' << j << ' ' << j - i + 1 << ' ' << len << '\n'; } ans = min(ans, (max(lb, j) - i + 1) * len); } for (int j = 0; j < d; j++) { while (!que[j].empty() && que[j].front() == i) { que[j].pop(); que[j].push(i + d); } } } cout << ans << '\n'; } /* 4 1 5 1 4 4 1 1 1 4 4 0 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...