Submission #149692

#TimeUsernameProblemLanguageResultExecution timeMemory
149692USA1 (#200)Trip to the Galapagos Islands (FXCUP4_island)C++17
31 / 100
261 ms26516 KiB
#include "island.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 100100; const int BSIZE = 500; const int NBUCK = 210; int N, M; int fval[MAXN]; int floc[MAXN]; int par[MAXN]; vector <int> guys[MAXN]; vector <int> dists[MAXN]; int ndist[MAXN]; int oloc[MAXN]; int nmin[MAXN][20]; int nhun[MAXN]; void uni (int left, int right, int now) { left = par[left]; right = par[right]; if (left == right) return; if (guys[left].size() < guys[right].size()) swap (left, right); dists[left].push_back(now); for (int guy : guys[right]) { guys[left].push_back(guy); par[guy] = left; } for (int dist : dists[right]) { dists[left].push_back(dist); } guys[right].clear(); dists[right].clear(); } void Init(int K, std::vector<int> F, std::vector<int> S, std::vector<int> E){ N = F.size(), M = S.size(); for (int i = 0; i < N; i++) { fval[i] = F[i]; floc[fval[i]] = i; } for (int i = 0; i < N; i++) { guys[i].clear(); dists[i].clear(); guys[i].push_back(i); par[i] = i; } for (int i = M - 1; i >= 0; i--) { int l = S[i], r = E[i]; uni (l, r, i + 1); } int cp = par[0]; for (int i = 0; i < N; i++) { if (i < N - 1) ndist[i] = dists[cp][i]; oloc[guys[cp][i]] = i; } for (int i = 0; i < N; i++) nmin[i][0] = ndist[i]; for (int a = 0; a < 19; a++) { for (int i = 0; i < N; i++) { nmin[i][a+1] = nmin[i][a]; if (i + (1 << a) < N) nmin[i][a+1] = min (nmin[i][a], nmin[i+(1<<a)][a]); } } } int gogo (int x, int y) { if (x > y) swap (x, y); int np = 31 - __builtin_clz(y - x); return min (nmin[x][np], nmin[y-(1<<np)][np]); } int Separate(int A, int B) { return gogo (oloc[floc[A]], oloc[floc[B]]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...