Submission #477851

#TimeUsernameProblemLanguageResultExecution timeMemory
477851hohohahaRoad Construction (JOI21_road_construction)C++14
0 / 100
1072 ms2097156 KiB
// #pragma GCC optimize("Ofast") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma") // #pragma GCC optimize("unroll-loops") #include "bits/stdc++.h" // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/trie_policy.hpp> // #include <ext/rope> using namespace std; // using namespace __gnu_pbds; // using namespace __gnu_cxx; #define li long long #define ld long double #define ii pair<int, int> #define dd pair<double, double> #define lii pair<li, li> #define ldd pair<ld, ld> #define vi vector<int> // typedef vector<int> vi + #define int long long -> vi is still vector of 32 bit int, which took me 2 hours to figure out #define vd vector<double> // untested #define vli vector<li> #define vld vector<ld> #define vii vector<ii> #define vdd vector<dd> #define vlii vector<lii> #define vldd vector<ldd> #define vvi vector<vi> #define vvii vector<vii> #define vvli vector<vli> #define vvlii vector<vlii> #define fi first #define se second #define mp make_pair #define pb push_back #define pf push_front #define eb emplace_back #define em emplace #define ob pop_back #define om pop #define of pop_front #define fr front #define bc back #define fori(i, a, b) for(int i = (int) (a); i <= (int) (b); ++i) #define ford(i, a, b) for(int i = (int) (a); i >= (int) (b); --i) #define all(x) begin(x), end(x) #define sz(x) ((int)(x).size()) #define bitc __builtin_popcountll mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define rand rng #define endl '\n' #define sp ' ' #define fastio() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); #define int long long // for convenience, not recommended // #define double long double void solve(); signed main() { freopen("test.inp","r",stdin); freopen("test.out","w",stdout); // fastio(); int tc = 1; fori(test, 1, tc) { solve(); } return 0; } #define int long long const ld pi = 4 * atan(1.0), eps = 1e-9; const int maxn = 2.5e5 + 5, inf = 1e16; int n, k; int x[maxn], y[maxn]; vector<pair<int, ii> > all; struct node { ii mn = { inf, 0}; node * l = 0, * r = 0; node(ii mn) : mn(mn), l(0), r(0) {}; node(node * l, node * r): l(l), r(r) { if(l) mn = min(mn, l->mn); if(r) mn = min(mn, r->mn); } }; node * build(int l, int r) { if(l == r) return new node(ii(inf, inf)); int m = l + r >> 1; return new node(build(l, m), build(m + 1, r)); } node* sett(node * now, int l, int r, int p, ii v) { if(l == r) return new node(v); int m = l + r >> 1; return p <= m? new node(sett(now->l, l, m, p, v), now->r): new node(now->l, sett(now->r, m + 1, r, p, v)); } ii get(node *now, int l, int r, int ll, int rr) { if(l > rr or ll > r) return {inf, 0}; if(ll <= l and r <= rr) return now->mn; int m = l + r >> 1; return min(get(now->l, l, m, ll, rr), get(now->r, m + 1, r, ll, rr)); } int cv[maxn]; void handle() { vector<pair<ii, int> > pp; fori(i, 1, n) pp.eb(ii(x[i], y[i]), i); map<int, int> mm; for(auto t: pp) mm[t.fi.se] = 1; int tt = 0; for(auto &t: mm) t.se = ++tt; fori(i, 1, n) cv[i] = mm[y[i]]; vector<node*> vv(n + 1, 0); priority_queue<pair<int, ii>, vector<pair<int, ii> >, greater<pair<int, ii> > > ss; sort(all(pp)); reverse(all(pp)); node* last = build(1, n); for(auto t: pp) { int i = t.se; vv[i] = last; ii mn = get(last, 1, n, cv[i], n); if(mn.fi == inf) continue; ss.em(mn.fi - x[i] - y[i], ii(mn.se, i)); last = sett(last, 1, n, cv[i], ii(x[i] + y[i], i)); } fori(tm, 1, k) { if(ss.empty() ) return; auto t = ss.top(); ss.pop(); int i = t.se.se, j = t.se.fi; all.eb(t.fi, ii(min(i, j), max(i, j)) ); vv[i] = sett(vv[i], 1, n, cv[j], {inf, 0}); ii mn = get(vv[i], 1, n, cv[i], n); if(mn.fi >= inf) continue; ss.em(mn.fi - x[i] - y[i], ii(mn.se, i)); } } void solve() { cin >> n >> k; fori(i, 1, n) { cin >> x[i] >> y[i]; } fori(tm, 0, 3) { // cout << tm << endl; fori(i,1, n) { swap(x[i], y[i]); x[i] = -x[i]; } handle(); } sort(all(all)); auto tt = all; all.clear(); for(auto t: tt) if(!all.size() or all.back() != t) all.eb(t); assert(all.size() >= k); fori(i, 0, k - 1) { cout << all[i].fi << endl; } }

Compilation message (stderr)

road_construction.cpp: In function 'node* build(long long int, long long int)':
road_construction.cpp:95:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   95 |  int m = l + r >> 1; return new node(build(l, m), build(m + 1, r));
      |          ~~^~~
road_construction.cpp: In function 'node* sett(node*, long long int, long long int, long long int, std::pair<long long int, long long int>)':
road_construction.cpp:99:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   99 |  int m = l + r >> 1; return p <= m? new node(sett(now->l, l, m, p, v), now->r): new node(now->l, sett(now->r, m + 1, r, p, v));
      |          ~~^~~
road_construction.cpp: In function 'std::pair<long long int, long long int> get(node*, long long int, long long int, long long int, long long int)':
road_construction.cpp:104:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  104 |  int m = l + r >> 1;
      |          ~~^~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from road_construction.cpp:5:
road_construction.cpp: In function 'void solve()':
road_construction.cpp:156:20: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  156 |  assert(all.size() >= k);
      |         ~~~~~~~~~~~^~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:67:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |  freopen("test.inp","r",stdin);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
road_construction.cpp:68:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |  freopen("test.out","w",stdout);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...