제출 #43106

#제출 시각아이디문제언어결과실행 시간메모리
43106RayaBurong25_1Ancient Books (IOI17_books)C++14
0 / 100
2 ms740 KiB
#include "books.h" #include <vector> #include <map> typedef struct range range; struct range { int e; long long m; }; // bool operator<(range a, range b) // { // return a.s < b.s; // } int vis[1000005]; int abs(int a) { return (a < 0)?-a:a; } int min(int a, int b) { return (a < b)?a:b; } int max(int a, int b) { return (a > b)?a:b; } long long minimum_walk(std::vector<int> p, int ss) { std::map<int, range> R; int i, n = p.size(); int s, e; long long m; for (i = 0; i < n; i++) { if (!vis[i]) { s = i; e = i; m = 0; while (!vis[i]) { vis[i] = 1; m += abs(p[i] - i); i = p[i]; s = min(s, i); e = max(e, i); } // printf("%d %d %lld\n", s, e, m); if (m != 0) R.insert(std::make_pair(s, range{e, m})); } } std::map<int, range>::iterator it, it2; for (it = R.begin(); it != R.end();) { if (it != R.begin() && it->second.e < it2->second.e) { it2->second.m += it->second.m; it = R.erase(it); } else if (it != R.begin() && it2->second.e > it->first) { it2->second.m += it->second.m; it2->second.e = it->second.e; it = R.erase(it); } else { it2 = it; it++; } } long long Ans = 0; for (it = R.begin(); it != R.end(); it++) { // printf("%d %d %lld\n", it->first, it->second.e, it->second.m); Ans += it->second.m; if (it != R.begin()) Ans += 2LL*(it->first - it2->second.e); else if (ss < it->first) Ans += 2LL*(it->first - ss); it2 = it; } if (ss > it2->second.e) Ans += 2LL*(ss - it2->second.e); 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...