Submission #1218495

#TimeUsernameProblemLanguageResultExecution timeMemory
1218495andrej246고대 책들 (IOI17_books)C++20
100 / 100
847 ms181116 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; #define NL "\n" #define EL cout << NL #define FOR(i,n) for (long long i = 0; i < (n); i++) #define FORS(i,s,n) for (long long i = (s); i < (n); i++) #define FORR(i,n) for (long long i = (n)-1; i >= 0; i--) #define PRINTV(v) for (auto a: v) {cout << a << " ";} EL; #define PRINTVV(v) for (auto a: v) {PRINTV(v);} #define f first #define s second #define all(v) (v).begin(),(v).end() typedef long long ll; typedef vector<ll> vl; typedef vector<vl> vvl; typedef pair<ll,ll> pl; typedef vector<pl> vpl; typedef vector<vpl> vvpl; vl dsu; vl sz; ll find(ll u) { if (dsu[u] == u) return u; return dsu[u] = find(dsu[u]); } void unite(ll a, ll b) { ll x = find(a); ll y = find(b); if (x == y) return; if (sz[x] < sz[y]) swap(x,y); sz[x] += sz[y]; dsu[y] = x; } long long minimum_walk(std::vector<int> p, int s) { int farthest = 0; ll n = p.size(); ll ans = 0; deque<ll> empty(n-1); dsu.resize(n); sz.assign(n,1); FOR(i,n) dsu[i] = i; FOR(i,n) unite(i,p[i]); FOR(i,n) { if (i > farthest) empty[i-1] = true; if (p[i] < i) continue; ans += 2*(p[i]-i); farthest = max(farthest,p[i]); } ll i = 0; while (i < s) { if (!empty.front()) break; empty.pop_front(); i++; } i = n-2; while (i >= s) { if (!empty.back()) break; empty.pop_back(); i--; } for (auto x: empty) ans += 2*x; set<pl> ranges; FOR(i,n) { ll a = i; ll b = p[i]; if (a > b) swap(a,b); ranges.insert({a,b}); } set<pl> open; vpl merged; for (auto [a,b]: ranges) { while (!open.empty() && (*open.begin()).f < a) { auto [y,x] = *open.begin(); merged.push_back({x,y}); open.erase(open.begin()); } ll earliest = a; while (!open.empty() && (*open.begin()).f < b) { auto [y,x] = *open.begin(); earliest = min(earliest,x); open.erase(open.begin()); unite(x,a); } open.insert({b,earliest}); } while (!open.empty() && (*open.begin()).f < n) { auto [y,x] = *open.begin(); merged.push_back({x,y}); open.erase(open.begin()); } vl side1(n,1e18); vl side2(n,-1e18); FOR(i,n) { ll j = find(i); if (i <= s) side1[j] = min(side1[j],i); if (i >= s) side2[j] = max(side2[j],i); } ll id = -1; FOR(i,n) { ll j = find(i); if (side1[j] != 1e18 && side2[j] != -1e18) { id = j; break; } } vvl g(n); FOR(i,n-1) { ll a = find(i); ll b = find(i+1); g[a].push_back(b); g[b].push_back(a); } vl dist(n,1e18); dist[find(s)] = 0; deque<ll> q; q.push_back(find(s)); while (!q.empty()) { ll u = q.front(); q.pop_front(); for (auto v: g[u]) { if (dist[v] > dist[u]+1) { dist[v] = dist[u]+1; q.push_back(v); } } } ans += dist[id]*2; return ans; }
#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...