Submission #151174

#TimeUsernameProblemLanguageResultExecution timeMemory
151174imyujinTrip to the Galapagos Islands (FXCUP4_island)C++17
31 / 100
5010 ms24676 KiB
#include "island.h" #include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; #define eb emplace_back #define allv(v) ((v).begin()),((v).end()) const int SQRTN = 320; const int MAXN = SQRTN * SQRTN; const int MAXM = 300010; const int MX = 1 << 17; int N, M; vector<int> node[MAXN], ed[MAXN]; int uni[MAXN]; vector<int> idx[MAXN]; int mem[SQRTN][SQRTN]; int bigidx[MAXN]; int seg[2 * MX]; int guni(int x) { return x == uni[x] ? x : guni(uni[x]); } void mkseg(int idx, int l, int r) { if(l == r) seg[idx] = ed[0][l]; else { int m = (l + r) / 2; mkseg(idx * 2, l, m); mkseg(idx * 2 + 1, m + 1, r); seg[idx] = min(seg[idx * 2], seg[idx * 2 + 1]); } } int gseg(int idx, int l, int r, int x, int y) { if(x <= l && r <= y) return seg[idx]; else if(r < x || y < l) return M; int m = (l + r) / 2; return min(gseg(idx * 2, l, m, x, y), gseg(idx * 2 + 1, m + 1, r, x, y)); } int gseg(int x, int y) { return gseg(1, 0, N - 2, x, y); } void Init(int K, vector<int> F, vector<int> S, vector<int> E){ N = F.size(); M = S.size(); for(int i = 0; i < N; i++) { uni[i] = i; node[i].eb(i); } for(int i = M - 1; i >= 0; i--) { S[i] = guni(S[i]); E[i] = guni(E[i]); if(S[i] == E[i]) continue; if(node[S[i]].size() < node[E[i]].size()) swap(S[i], E[i]); node[S[i]].insert(node[S[i]].end(), allv(node[E[i]])); ed[S[i]].eb(i); ed[S[i]].insert(ed[S[i]].end(), allv(ed[E[i]])); uni[E[i]] = S[i]; } for(int i = 0; i < N; i++) if(i == uni[i]) { node[0] = node[i]; ed[0] = ed[i]; } for(int i = 0; i < N; i++) idx[F[node[0][i]]].eb(i); mkseg(1, 0, N - 2); int cnt = 0; for(int i = 0; i < K; i++) bigidx[i] = idx[i].size() > SQRTN ? cnt++ : -1; for(int i = 0; i < cnt; i++) for(int j = 0; j < cnt; j++) mem[i][j] = -1; } int Separate(int A, int B){ if(bigidx[A] != -1 && bigidx[B] != -1 && mem[bigidx[A]][bigidx[B]] != -1) return mem[bigidx[A]][bigidx[B]]; if(idx[A].size() > idx[B].size()) swap(A, B); int ans = 0; for(auto a : idx[A]) { int lb = lower_bound(allv(idx[B]), a) - idx[B].begin(); if(lb != 0) ans = max(ans, gseg(idx[B][lb - 1], a - 1)); if(lb != idx[B].size()) ans = max(ans, gseg(a, idx[B][lb] - 1)); } if(bigidx[A] != -1 && bigidx[B] != -1) mem[bigidx[A]][bigidx[B]] = mem[bigidx[B]][bigidx[A]] = ans + 1; return ans + 1; }

Compilation message (stderr)

island.cpp: In function 'int Separate(int, int)':
island.cpp:80:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(lb != idx[B].size()) ans = max(ans, gseg(a, idx[B][lb] - 1));
      ~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...