Submission #709447

#TimeUsernameProblemLanguageResultExecution timeMemory
709447cig32Road Construction (JOI21_road_construction)C++17
0 / 100
10067 ms29676 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 5e5+2; const int MOD = 1e9 + 7; mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count()); int rnd(int x, int y) { int u = uniform_int_distribution<int>(x, y)(rng); return u; } int bm(int b, int p) { if(p==0) return 1 % MOD; int r = bm(b, p >> 1); if(p&1) return (((r*r) % MOD) * b) % MOD; return (r*r) % MOD; } int inv(int b) { return bm(b, MOD-2); } int fastlog(int x) { return (x == 0 ? -1 : 64 - __builtin_clzll(x) - 1); } void printcase(int i) { cout << "Case #" << i << ": "; } bool cmp1(pair<int,int> x, pair<int,int> y) { return x.first+x.second < y.first+y.second; } bool cmp2(pair<int,int> x, pair<int,int> y) { return x.first-x.second < y.first-y.second; } int bit[MAXN]; void add(int x, int v) { for(;x<MAXN;x+=x&-x) bit[x] += v; } int sum(int x) { int s=0; for(;x;x-=x&-x) s += bit[x]; return s; } void clear() { for(int i=0; i<MAXN; i++) bit[i] = 0; } long long count(vector<pair<int,int> >v, int d) { int n = v.size(); set<int>disc; for(int i=0; i<n; i++) { disc.insert(v[i].first-v[i].second); } map<int,int>is; int it=1; for(int x: disc) { is[x] = it++; } long long ans=0; sort(v.begin(), v.end(), cmp1); clear(); int j=0; for(int i=0; i<v.size(); i++) { while(j<i && (v[i].first+v[i].second)-(v[j].first+v[j].second) > d) { add(is[v[j].first-v[j].second], -1); j++; } auto it = disc.lower_bound(v[i].first-v[i].second+d+1); it--; int ub = is[*it]; it = disc.lower_bound(v[i].first-v[i].second-d); int lb = is[*it]; ans += sum(ub) - (lb == 0 ? 0 : sum(lb-1)); add(is[v[i].first-v[i].second], 1); } return ans; } vector<int> all(vector<pair<int,int> >v, int d) { int n = v.size(); set<int>disc; for(int i=0; i<n; i++) { disc.insert(v[i].first-v[i].second); } map<int,int>is; int it=1; for(int x: disc) { is[x] = it++; } int ans=0; sort(v.begin(), v.end(), cmp1); int j=0; vector<int> result; multiset<pair<int, int> > ms; for(int i=0; i<v.size(); i++) { while(j<i && (v[i].first+v[i].second)-(v[j].first+v[j].second) > d) { ms.erase(ms.lower_bound({v[j].first-v[j].second, v[j].first+v[j].second})); j++; } int ub = v[i].first-v[i].second+d, lb = v[i].first-v[i].second-d; if(ms.size()) { auto it = ms.lower_bound({lb, -4e9}); while(it != ms.end() && (*it).first <= ub) { int x = abs((*it).first - (v[i].first - v[i].second)); int y = abs((*it).second - (v[i].first + v[i].second)); result.push_back(max(x, y)); it++; } } ms.insert({v[i].first-v[i].second, v[i].first+v[i].second}); } return result; } void solve(int tc) { int n, k; cin >> n >> k; vector<pair<int,int> > points; for(int i=0; i<n; i++) { int x, y; cin >> x >> y; points.push_back({x, y}); } int lb = 0, rb = 4e9; while(lb < rb) { int mid = (lb + rb + 1) >> 1; long long c = count(points, mid); if(c <= k) lb = mid; else rb = mid - 1; } vector<int> res = all(points, lb); sort(res.begin(), res.end()); for(int x: res) cout << x << "\n"; int finc = count(points, lb); if(finc < k) { rb = 4e9; lb++; while(lb < rb) { int mid = (lb + rb) >> 1; long long c = count(points, mid); if(c != finc) rb = mid; else lb = mid + 1; } for(int i=finc+1; i<=k; i++) cout << lb << "\n"; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; for(int i=1; i<=t; i++) solve(i); }

Compilation message (stderr)

road_construction.cpp: In function 'long long int count(std::vector<std::pair<int, int> >, int)':
road_construction.cpp:55:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp: In function 'std::vector<int> all(std::vector<std::pair<int, int> >, int)':
road_construction.cpp:87:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |   for(int i=0; i<v.size(); i++) {
      |                ~^~~~~~~~~
road_construction.cpp:82:7: warning: unused variable 'ans' [-Wunused-variable]
   82 |   int ans=0;
      |       ^~~
road_construction.cpp: In function 'void solve(int)':
road_construction.cpp:115:20: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+9' to '2147483647' [-Woverflow]
  115 |   int lb = 0, rb = 4e9;
      |                    ^~~
road_construction.cpp:127:10: warning: overflow in conversion from 'double' to 'int' changes value from '4.0e+9' to '2147483647' [-Woverflow]
  127 |     rb = 4e9;
      |          ^~~
#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...