Submission #65779

#TimeUsernameProblemLanguageResultExecution timeMemory
65779MatheusLealVAncient Books (IOI17_books)C++17
22 / 100
2074 ms71852 KiB
#include "books.h" #define N 1000005 #define f first #define ss second #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; ll ans = 0; ll n, maior[N], menor[N], qtd = 0, ok[N], en; int pai[N], peso[N]; int find(int x) { if(x == pai[x]) return x; return pai[x] = find(pai[x]); } void join(int a, int b) { a = find(a), b = find(b); //cout<<"JOIN "<<a<<" "<<b<<"\n"; if(a == b) return; if(peso[a] > peso[b]) pai[b] = a; else if(peso[a] < peso[b]) pai[a] = b; else pai[a] = b, peso[b] ++; } vector<int> g; void dfs(ll x, ll &mx, ll &mn) { mx = max(mx, maior[x]); if(ok[x]) return; ok[x] = 1; dfs(g[x], mx, mn); } ll minimum_walk(vector<int> p, int s) { n = p.size(); g = p; for(ll i = 0; i < n; i++) ans += abs(i - p[i]); for(int i = 0; i < n; i++) maior[i] = menor[i] = i; for(ll i = n - 1; i >= 0; i--) { if(p[i] != i) { en = i; break; } } vector<pii> sweep; for(int i = 0; i <= en; i++) { if(ok[i]) continue; dfs(i, maior[i], menor[i]); //cout<<"COLOCA "<<menor[i]<<" "<<maior[i]<<"\n"; sweep.push_back({menor[i], maior[i]}); } sort(sweep.begin(), sweep.end()); for(int i = 0; i < (int)sweep.size(); i++) pai[i] = i; for(int i = 0; i < (int)sweep.size(); i++) { auto b = sweep[i]; for(int j = 0; j < i; j++) { auto a = sweep[j]; if(a.f <= b.f and b.f <= a.ss) join(i, i - 1); } } set<int> q; for(int i = 0; i < (int)sweep.size(); i++) { q.insert(find(i)); } ll qtd = q.size(); //cout<<q.size()<<"\n"; return ans + 2*(qtd - 1); }
#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...