Submission #1112099

#TimeUsernameProblemLanguageResultExecution timeMemory
1112099onbertRoad Construction (JOI21_road_construction)C++17
100 / 100
5526 ms18348 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 250005, INF = 1e10 + 10; int n, k; pair<int, int> a[maxn]; int ysz; vector<int> xvals = {-INF}, yvals = {-INF}; int ldc(int x) {return lower_bound(yvals.begin(), yvals.end(), x) - yvals.begin();} int rdc(int x) {return upper_bound(yvals.begin(), yvals.end(), x) - yvals.begin() - 1;} int fen[maxn]; void update(int id) { while (id <= ysz) { fen[id]++; id += (id & -id); } } int qry(int id) { int val = 0; while (id >= 1) { val += fen[id]; id -= (id & -id); } return val; } int cunt(int dist) { int ans = 0, pt = 0; for (int i=1;i<=n;i++) { while (pt+1 <= n && a[pt+1].first <= a[i].first + dist) { pt++; int L = ldc(a[pt].second - dist), R = rdc(a[pt].second + dist); ans -= qry(R) - qry(L-1); // cout << "- " << (a[pt].first+a[pt].second)/2 << " " << (a[pt].first-a[pt].second)/2 << " " << qry(R) - qry(L-1) << endl; } int L = ldc(a[i].second - dist), R = rdc(a[i].second + dist); ans += qry(R) - qry(L-1); // cout << "+ " << (a[i].first+a[i].second)/2 << " " << (a[i].first-a[i].second)/2 << " " << qry(R) - qry(L-1) << endl; int pos = ldc(a[i].second); update(pos); } return ans; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for (int i=1;i<=n;i++) { int x, y; cin >> x >> y; a[i] = {x+y, x-y}; xvals.push_back(x+y); yvals.push_back(x-y); } sort(a+1, a+n+1); sort(xvals.begin(), xvals.end()); xvals.erase(unique(xvals.begin(), xvals.end()), xvals.end()); sort(yvals.begin(), yvals.end()); yvals.erase(unique(yvals.begin(), yvals.end()), yvals.end()); ysz = yvals.size() - 1; int L = 1, R = INF; while (L < R) { int mid = (L+R)/2; if (cunt(mid) < k) L = mid+1; else R = mid; } int dist = L - 1; vector<int> ans; multiset<pair<int,int>> s; s.insert({INF, INF}); int l = 0, r = 0; int cnt = 0; for (int i=1;i<=n;i++) { while (r+1 <= n && a[r+1].first <= a[i].first + dist) { r++; s.insert({a[r].second, a[r].first}); } while (l+1 <= n && a[l+1].first < a[i].first - dist) { l++; s.erase({a[l].second, a[l].first}); } // cout << "test\n"; // cout << (a[i].first+a[i].second)/2 << " " << (a[i].first-a[i].second)/2 << endl; auto it = s.lower_bound({a[i].second - dist, -INF}); while ((it->first) <= a[i].second + dist) { pair<int,int> cur = *it; if (a[i].first!=cur.second || a[i].second!=cur.first) { ans.push_back(max(abs(a[i].first - cur.second), abs(a[i].second - cur.first))); // assert(max(abs(a[i].first - cur.second), abs(a[i].second - cur.first)) <= dist); cnt++; // cout << max(abs(a[i].first - cur.second), abs(a[i].second - cur.first)) << endl; } it++; } } while (ans.size() < 2*k) ans.push_back(L); sort(ans.begin(), ans.end()); for (int i=0;i<2*k;i+=2) cout << ans[i] << '\n'; }

Compilation message (stderr)

road_construction.cpp: In function 'int main()':
road_construction.cpp:101:23: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  101 |     while (ans.size() < 2*k) ans.push_back(L);
      |            ~~~~~~~~~~~^~~~~
#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...