Submission #207586

#TimeUsernameProblemLanguageResultExecution timeMemory
207586AlexLuchianovAncient Books (IOI17_books)C++14
0 / 100
5 ms376 KiB
#include "books.h" #include <cmath> #include <iostream> #include <cassert> #include <vector> using namespace std; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) using ll = long long; int const nmax = 1000000; namespace Dsu{ std::vector<int> mult; void initialize(int n){ mult.resize(1 + n); for(int i = 1;i <= n; i++) mult[i] = i; } int jump(int gala){ if(mult[gala] != gala) mult[gala] = jump(mult[gala]); return mult[gala]; } bool unite(int gala, int galb){ gala = jump(gala); galb = jump(galb); if(gala == galb) return 0; mult[galb] = gala; return 1; } } int seen[1 + nmax]; int target[1 + nmax]; void processCycle(int node, ll &result){ seen[node] = 1; result += fabs(target[node] - node); Dsu::unite(node, target[node]); if(seen[target[node]] == 0) processCycle(target[node], result); } struct Edge{ int x, y; int cost; bool operator < (Edge const &a) const { return cost < a.cost; } }; long long minimum_walk(std::vector<int> p, int start) { int n = p.size(); for(int i = 0; i < n; i++) target[i] = p[i]; Dsu::initialize(n); ll result = 0; for(int i = 0; i < n; i++) if(i != target[i] && seen[i] == 0) processCycle(i, result); int last = -1; vector<Edge> v; for(int i = 0; i < n; i++){ if(i != target[i] || i == start) { if(0 <= last) v.push_back({Dsu::jump(last), Dsu::jump(i), i - last}); last = i; } } for(int i = 0; i < v.size(); i++) if(Dsu::unite(v[i].x, v[i].y) == 1) result += 2 * v[i].cost; return result; } /* 5 1 3 0 2 1 4 6 2 5 1 2 3 4 0 */

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:76:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < v.size(); i++)
                  ~~^~~~~~~~~~
#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...