Submission #392368

#TimeUsernameProblemLanguageResultExecution timeMemory
392368ijxjdjdRoad Construction (JOI21_road_construction)C++17
100 / 100
8568 ms70324 KiB
#include <bits/stdc++.h> #define FR(i, N) for (int i = 0; i < int(N); i++) #define all(x) begin(x), end(x) #define int ll using namespace std; using ll = long long; const int MAXN = (int)(250000); const int INF = (int)(1e9);; struct point { int x, y; }; int dist(point& x, point& y) { return abs(x.x-y.x) + abs(x.y - y.y); } int SPLIT = 500; signed main() { cin.tie(0); cin.sync_with_stdio(0); int N, K; cin >> N >> K; if (N >= 200000) { SPLIT = 1250; } vector<point> vec(N); FR(i, N) { cin >> vec[i].x >> vec[i].y; } auto byX = [] (const point& lhs, const point& rhs) { return lhs.x < rhs.x; }; auto byY = [] (const point& lhs, const point& rhs) { return lhs.y < rhs.y; }; sort(all(vec), byX); list<point> cur; list<int> ans; int start = -1; for (int i = 0; i < N; i++) { cur.push_back(vec[i]); if ((i * (i+1))/2 >= K) { for (int j = 0; j <= i; j++) { for (int k = j+1; k <= i; k++) { ans.push_back(dist(vec[j], vec[k])); } } cur.sort(byY); ans.sort(); while (ans.size() > K) { ans.pop_back(); } start = i+1; break; } } for (int i = start; i < N; i+=SPLIT) { list<int> mdist; if (cur.size() > 0) { auto it = cur.begin(); while (it != cur.end()) { if ((*it).x <= vec[i].x - ans.back()) { it = cur.erase(it); } else { it++; } } } for (int j = i; j < min(N, i+SPLIT); j++) { for (int k = j+1; k < min(N, i+SPLIT); k++) { if (ans.back() > dist(vec[j], vec[k])) { mdist.push_back(dist(vec[j], vec[k])); } } } sort(vec.begin() + i, min(vec.end(), vec.begin() + i + SPLIT), byY); if (cur.size() > 0) { auto l = cur.begin(); auto r = cur.begin(); for (int j = i; j < min(N, i+SPLIT); j++) { while (next(r) != cur.end() && (*next(r)).y - vec[j].y < ans.back()) { r++; } while (l != cur.end() && vec[j].y - (*(l)).y >= ans.back()) { l++; } for (auto it = l; it != next(r); it++) { if (dist(*it, vec[j]) < ans.back()) { mdist.push_back(dist(*it, vec[j])); } } } } list<point> other; for (int j = i; j < min(N, i+SPLIT); j++) { other.push_back(vec[j]); } mdist.sort(); cur.merge(other, byY); ans.merge(mdist); while (ans.size() > K) { ans.pop_back(); } } for (auto it = ans.begin(); it != ans.end(); it++) { cout << *it << '\n'; } return 0; }

Compilation message (stderr)

road_construction.cpp: In function 'int main()':
road_construction.cpp:56:31: warning: comparison of integer expressions of different signedness: 'std::__cxx11::list<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   56 |             while (ans.size() > K) {
      |                    ~~~~~~~~~~~^~~
road_construction.cpp:108:27: warning: comparison of integer expressions of different signedness: 'std::__cxx11::list<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
  108 |         while (ans.size() > K) {
      |                ~~~~~~~~~~~^~~
#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...