Submission #1231280

#TimeUsernameProblemLanguageResultExecution timeMemory
1231280bangan나일강 (IOI24_nile)C++20
32 / 100
86 ms6216 KiB
#include "nile.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ALL(a) a.begin(), a.end() std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { int N = W.size(); int Q = E.size(); vector<int> ord(N); iota(ALL(ord), 0); sort(ALL(ord), [&](int i, int j) { return W[i]<W[j]; }); auto f = [&](int i) { return W[ord[i+1]]-W[ord[i]]; }; vector<int> edges(N-1); iota(ALL(edges), 0); sort(ALL(edges), [&](int i, int j) { return f(i) < f(j); }); vector<int> qry(Q); iota(ALL(qry), 0); sort(ALL(qry), [&](int i, int j) { return E[i]<E[j]; }); ll res = 2*N; vector<int> par(N), sz(N); for (int i=0; i<N; i++) par[i]=i, sz[i]=1; auto find = [&](auto self, int v) -> int { return par[v]==v ? v : par[v] = self(self, par[v]); }; auto merge = [&](int v, int u) { v = find(find, v); u = find(find, u); assert(v != u); if (sz[v] < sz[u]) swap(v, u); res -= sz[v] + sz[v]%2; res -= sz[u] + sz[u]%2; sz[v] += sz[u]; par[u] = v; res += sz[v] + sz[v]%2; }; auto cur = edges.begin(); vector<ll> ans(Q); for (int id : qry) { while (cur != edges.end() && f(*cur) <= E[id]) { merge(*cur, *cur + 1); cur++; } ans[id] = res; } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...