Submission #893594

#TimeUsernameProblemLanguageResultExecution timeMemory
893594vjudge1Road Construction (JOI21_road_construction)C++17
0 / 100
10052 ms327888 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2,fma") #include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define int long long using namespace std; int pow(int a,int b,int m){int ans=1;while(b){if(b&1){ans=(ans*a)%m;}b>>=1;a=(a*a)%m;}return ans;} int binpow(int a,int b){int ans=1;while(b){if(b&1){ans=(ans*a);}b>>=1;a=(a*a);}return ans;} const int N = 1e5 + 2, inf = 3e9, MAXN = 3e5; int k; struct pt { int x, y, id; }; inline bool cmp_x (const pt & a, const pt & b) { return a.x < b.x || a.x == b.x && a.y < b.y; } inline bool cmp_y (const pt & a, const pt & b) { return a.y < b.y; } pt a[MAXN]; int mindist; int ansa, ansb; multiset <pair <int,int>> st; inline void upd_ans (const pt & a, const pt & b) { int dist = abs(a.x-b.x) + abs(a.y-b.y); if(st.find({dist, a.id * b.id + min(a.id, b.id)}) != st.end()){ return; } if((int)st.size() < k || (--st.end()) ->ff > dist){ if((int)st.size() < k){ st.insert({dist, a.id * b.id+ min(a.id, b.id)}); }else{ st.erase(--st.end()); st.insert({dist, a.id * b.id+ min(a.id, b.id)}); } } if((int)st.size() == k) mindist = (--st.end()) ->ff; } void rec (int l, int r) { if (r - l <= 3) { for (int i=l; i<=r; ++i) for (int j=i+1; j<=r; ++j) upd_ans (a[i], a[j]); sort (a+l, a+r+1, &cmp_y); return; } int m = (l + r) >> 1; int midx = a[m].x; rec (l, m), rec (m+1, r); static pt t[MAXN]; merge (a+l, a+m+1, a+m+1, a+r+1, t, &cmp_y); copy (t, t+r-l+1, a+l); int tsz = 0; for (int i=l; i<=r; ++i) if (abs (a[i].x - midx) < mindist) { for (int j=tsz-1; j>=0 && a[i].y - t[j].y < mindist; --j) upd_ans (a[i], t[j]); t[tsz++] = a[i]; } } main(){ iostream::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n >> k; for(int i = 0; i < n; i++){ cin >> a[i].x >> a[i].y; a[i].id = i + 1; } for(int i = n; i < n * 2; i++){ a[i].x = inf * i; a[i].id = i + 1; } sort (a, a+n * 2, &cmp_x); mindist = 1e18; rec (0, n * 2-1); for(auto x : st){ cout << x.ff <<"\n"; } }

Compilation message (stderr)

road_construction.cpp: In function 'bool cmp_x(const pt&, const pt&)':
road_construction.cpp:24:33: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   24 |  return a.x < b.x || a.x == b.x && a.y < b.y;
      |                      ~~~~~~~~~~~^~~~~~~~~~~~
road_construction.cpp: At global scope:
road_construction.cpp:78:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   78 | main(){
      | ^~~~
#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...