Submission #701867

#TimeUsernameProblemLanguageResultExecution timeMemory
701867baokhue232005Road Construction (JOI21_road_construction)C++17
32 / 100
3563 ms60184 KiB
/* #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimize("unroll-loops") */ // lethal option #include<bits/stdc++.h> using namespace std; #define all(flg) flg.begin(), flg.end() #define int long long #define pb push_back #define fi first #define se second #define eb emplace_back #define ii pair<int, int> #define endl "\n"; #define iii pair<int, ii> #define vi vector<int> #define PI 3.141592653589793238462643383279502884 #define ll long long #define ld long double #define for1(i, ff, gg) for(int i = ff; i <= gg; ++i) #define for2(i, ff, gg) for(int i = ff; i >= gg; --i) const ll mod = 1e9 + 7; const int maxN = 500005; const ll oo = 1e18 + 7; int n, a[maxN]; int x, y, z, k; int cx[maxN], cy[maxN]; vi ord; int ftree[maxN]; void inc(int plc){ while(plc < maxN){ ++ftree[plc]; plc += plc & -plc; } } int take(int plc){ int res = 0; while(plc){ res += ftree[plc]; plc -= plc & -plc; } return res; } iii qry[maxN]; int cnt = 0; int retro(int cut){ int cry = cut + 1; memset(ftree, 0, sizeof(ftree)); int res = 0; cnt = 0; for1(i, 1, n){ qry[cnt++] = {cy[i], ii(-2, cx[i])}; qry[cnt++] = {cy[i] - cry, ii(-1, cx[i] + cut)}; qry[cnt++] = {cy[i] - cry, ii(1 , cx[i] - cry)}; qry[cnt++] = {cy[i] + cut, ii(1 , cx[i] + cut)}; qry[cnt++] = {cy[i] + cut, ii(-1, cx[i] - cry)}; } sort(qry, qry + cnt); for1(i, 0, cnt - 1){ int cof = qry[i].se.fi; int plc = qry[i].se.se; plc = upper_bound(all(ord), plc) - ord.begin() - 1; if(cof == -2) inc(plc); else res += take(plc) * cof; } res -= n; assert(res % 2 == 0); return res / 2; } signed main(){ // freopen(".inp", "r", stdin); ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n >> k; for1(i, 1, n){ cin >> x >> y; cx[i] = x + y; cy[i] = x - y; ord.pb(cx[i]); } ord.pb(-oo); ord.pb(oo); sort(all(ord)); ord.resize(unique(all(ord)) - ord.begin()); int l = 1, r = mod * 10; while(l != r){ int mid = (l + r) / 2; if(retro(mid) >= k) r = mid; else l = mid + 1; } vector<ii> tray; for1(i, 1, n) tray.pb(ii(cy[i], cx[i])); sort(all(tray)); for(ii &pr : tray) swap(pr.fi, pr.se); set<ii> st; st.insert(ii(oo, oo)); --l; vi ans; for(ii pr : tray){ ii coke = {pr.fi - l, -oo}; while(1){ int dt = abs(coke.fi - pr.fi); int ds = abs(coke.se - pr.se); if(dt > l) break; if(ds <= l) ans.pb(max(ds, abs(coke.fi - pr.fi))); else st.erase(coke); coke = *st.upper_bound(coke); } st.insert(pr); } sort(all(ans)); while(ans.size() < k) ans.pb(r); for(int cc : ans) cout << cc << endl; }

Compilation message (stderr)

road_construction.cpp: In function 'int main()':
road_construction.cpp:122:22: 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]
  122 |     while(ans.size() < k) ans.pb(r);
      |           ~~~~~~~~~~~^~~
#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...