Submission #123170

#TimeUsernameProblemLanguageResultExecution timeMemory
123170SirCenessAncient Books (IOI17_books)C++14
0 / 100
2 ms380 KiB
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define inside sl<=l&&r<=sr #define outside r<sl||sr<l #define inf 1000000009 using namespace std; typedef long long ll; int n; vector<int> arr; vector<ll> numara; vector<ll> beg; vector<ll> en; vector<pair<int, pair<int, int> > > edges; int num = 0; vector<pair<ll, ll> > minler; vector<int> dsu; int find(int node){ if (dsu[node] == node) return node; int ans = find(dsu[node]); return dsu[node] = ans; } void unionn(int node1, int node2){ node1 = find(node1); node2 = find(node2); if (node1 == node2) return; dsu[node1] = node2; } ll minimum_walk(vector<int> p, int s){ arr = p; n = p.size(); numara.resize(n); ll ans = 0; for (int i = 0; i < n; i++) numara[i] = -1; for (int i = 0; i < n; i++){ if (numara[i] == -1 && p[i] != i){ int node = i; int lmost = node; int rmost = node; while (numara[node] == -1){ numara[node] = num; ans += abs(p[node] - node); node = p[node]; lmost = min(lmost, node); rmost = max(rmost, node); } beg.pb(lmost); en.pb(rmost); num++; //ans += (2*(rmost-lmost)); } } //for (int i = 0; i < n; i++) cout << numara[i] << " "; cout << endl; /*int last = -1; for (int i = 0; i < n; i++){ if (numara[i] != -1){ if (last != -1) edges.pb(mp(i-last, mp(numara[i], numara[last]))); last = i; } } dsu.resize(num); for (int i = 0; i < num; i++) dsu[i] = i; sort(edges.begin(), edges.end()); for (int i = 0; i < edges.size(); i++){ if (find(edges[i].second.first) != find(edges[i].second.second)){ ans += edges[i].first; unionn(edges[i].second.first, edges[i].second.second); } } int mindist = inf; for (int i = s; i < n; i++){ if (numara[i] != -1){ mindist = min(mindist, i-s); break; } } for (int i = s; i >= 0; i--){ if (numara[i] != -1){ mindist = min(mindist, s-i); break; } } ans += 2*mindist;*/ vector<list<int> > begs(n); vector<list<int> > ens(n); for (int i = 0; i < num; i++){ begs[beg[i]].pb(i); ens[en[i]].pb(i); } set<int> open; for (int i = 0; i < n; i++){ for (list<int>::iterator it = begs[i].begin(); it != begs[i].end(); ++it){ open.insert(*it); } for (list<int>::iterator it = ens[i].begin(); it != ens[i].end(); ++it){ open.erase(open.find(*it)); } if (open.size() == 0) ans += 2; } ans -= 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...