제출 #283740

#제출 시각아이디문제언어결과실행 시간메모리
283740balbit고대 책들 (IOI17_books)C++14
50 / 100
328 ms34296 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define f first #define s second #define ALL(x) (x).begin(), (x).end() #define SZ(x) (int)((x).size()) #define pb push_back #ifdef BALBIT #define bug(...) cerr<<"#"<<__LINE__<<" "<<#__VA_ARGS__<<": ", _do(__VA_ARGS__) template <typename T> void _do(T && x) {cerr<<x<<endl;} template <typename T, typename ...S> void _do(T && x, S&&...y) {cerr<<x<<", "; _do(y...);} #define IOS() #else #define bug(...) #define IOS() ios::sync_with_stdio(0), cin.tie(0) #define endl '\n' #endif const int maxn = 1e6+5; bool seen[maxn]; int R[maxn], L[maxn]; bool st[maxn]; bool dv[maxn]; int RR[maxn], LL[maxn]; int par[maxn]; int find(int x) {return x == par[x]? x : par[x] = find(par[x]);} void mrg(int a, int b) { a = find(a); b = find(b); if (a == b) return; RR[a] = max(RR[a], RR[b]); LL[a] = min(LL[a], LL[b]); par[b] = a; } ll minimum_walk(vector<int> p, int s) { memset(seen, 0, sizeof seen); int n = SZ(p); ll re= 0; for (int i = 0; i<n; ++i) { // --p[i]; re+= abs(i-p[i]); } // vector<pair<pii,int> > v; for (int i = 0; i<n; ++i) { if (!seen[i]) { st[i] = 1; seen[i] = 1; R[i] = L[i] = i; for (int x = p[i]; x != i; x = p[x]) seen[x] = 1, R[i] = max(R[i], x); for (int x = p[i]; x != i; x = p[x]) R[x] = R[i]; bug(i, L[i], R[i]); LL[i] = L[i]; RR[i] =R[i]; } } int nmx = 0; re -= 2; for (int i = 0; i<n; ++i) { nmx = max(nmx, R[i]); if (nmx <= i) { re += 2; dv[i] = 1; } // if (i == s && nmx > i) { // int ad = 0; // for (int j = 1; ; ++j) { // if (p[i+j] != i+j || p[i-j] != i-j) { // ad = j; break; // } // } // bug(ad); // } } for (int i = 0; i<n; ++i) par[i] = i; vector<pii> stk; for (int i = 0; i<n; ++i) { if (st[i]) { while (!stk.empty() && i > stk.back().s) stk.pop_back(); int newl = i; while (!stk.empty() && R[i] > stk.back().s) { mrg(i, stk.back().f); newl = stk.back().f; stk.pop_back(); } stk.pb({newl, R[i]}); } } { int l= LL[find(s)], r = RR[find(s)]; for (int i=l-1; i>=0; --i) { if (st[i] && RR[find(i)]>r) { re += min(l-LL[find(i)], RR[find(i)] - r) * 2; l = LL[find(i)]; r = RR[find(i)]; i = l-1; } } } for (int i = 0; i<n; ++i) { if (p[i] == i && i != s) re -= 2; else break; } for (int i = n-1; i>=0; --i) { if (p[i] == i && i != s) re -= 2; else break; } return re; } #ifdef BALBIT signed main(){ IOS(); bug(minimum_walk({3,1,2,0},0)); // bug(minimum_walk({3,2,1,0},0)); // bug(minimum_walk({1,0,3,2},0)); } #endif
#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...