Submission #1245553

#TimeUsernameProblemLanguageResultExecution timeMemory
1245553ducdevPastiri (COI20_pastiri)C++20
8 / 100
324 ms102068 KiB
// Author: 4uckd3v - Nguyen Cao Duc #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N = 5e5; const int MOD = 1e9 + 7; const int INF = 1e9; template <class X, class Y> bool minimize(X &x, const Y &y) { if (x <= y) return false; x = y; return true; }; int n, k, timer, lg; int sheepIdx[MAX_N + 5], depth[MAX_N + 5], tin[MAX_N + 5], tout[MAX_N + 5]; int up[MAX_N + 5][20]; vector<int> adj[MAX_N + 5]; void preDfs(int u, int par) { tin[u] = ++timer; up[u][0] = par; depth[u] = depth[par] + 1; for (int i = 1; i <= lg; i++) up[u][i] = up[up[u][i - 1]][i - 1]; for (int v : adj[u]) { if (v == par) continue; preDfs(v, u); }; tout[u] = ++timer; }; bool isAncestor(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; }; int __lca(int u, int v) { if (isAncestor(u, v)) return u; if (isAncestor(v, u)) return v; for (int i = lg; i >= 0; i--) if (!isAncestor(up[u][i], v)) u = up[u][i]; return up[u][0]; }; int dist(int u, int v) { return depth[u] + depth[v] - 2 * depth[__lca(u, v)]; }; namespace SUBTASK_1 { const int N = 5e5; int dp[N + 5]; bool checkSubtask() { for (int u = 1; u <= n; u++) if (adj[u].size() > 2) return false; return true; }; void trace(int i) { vector<int> t; while (i > 0) { if (dp[i] == dp[i - 1] + 1) { t.push_back(sheepIdx[i]); i--; } else { int prevIdx = sheepIdx[i - 1]; int curIdx = sheepIdx[i]; t.push_back((curIdx + prevIdx + 1) >> 1); i -= 2; }; }; for (int idx : t) cout << idx << ' '; cout << '\n'; }; void Solve() { for (int i = 1; i <= n; i++) dp[i] = INF; dp[1] = 1; for (int i = 2; i <= k; i++) { int prevIdx = sheepIdx[i - 1]; int curIdx = sheepIdx[i]; if ((curIdx - prevIdx + 1) & 1) { minimize(dp[i], dp[i - 2] + 1); }; minimize(dp[i], dp[i - 1] + 1); }; cout << dp[k] << '\n'; trace(k); }; }; // namespace SUBTASK_1 namespace SUBTASK_2 { const int N = MAX_N; const int K = 15; int dp[1 << K], node[1 << K]; bool checkSubtask() { return k <= K && n <= N; }; void trace(int mask) { while (mask > 0) { for (int subMask = mask; subMask > 0; subMask &= (subMask - 1) & mask) { if (node[subMask] == 0) continue; if (dp[mask] == dp[mask ^ subMask] + dp[subMask]) { cout << node[subMask] << ' '; mask ^= subMask; break; }; }; }; }; void Solve() { for (int mask = 0; mask < (1 << k); mask++) dp[mask] = INF; dp[0] = 0; for (int u = 1; u <= n; u++) { int minDist = INF; int mask = 0; for (int j = 1; j <= k; j++) { int v = sheepIdx[j]; if (minimize(minDist, dist(u, v))) { mask = 1 << (j - 1); } else if (minDist == dist(u, v)) { mask |= 1 << (j - 1); }; }; if (mask > 0) { node[mask] = u; }; }; for (int mask = 0; mask < (1 << k); mask++) { for (int subMask = mask; subMask > 0; subMask &= (subMask - 1) & mask) { if (node[subMask] == 0) continue; minimize(dp[mask], dp[mask ^ subMask] + 1); }; }; cout << dp[(1 << k) - 1] << '\n'; trace((1 << k) - 1); }; }; // namespace SUBTASK_2 int main() { ios_base::sync_with_stdio(0); cin.tie(0); if (fopen("PASTIRI.INP", "r")) { freopen("PASTIRI.INP", "r", stdin); freopen("PASTIRI.OUT", "w", stdout); }; cin >> n >> k; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); }; lg = ceil(log2(n)); preDfs(1, 1); for (int i = 1; i <= k; i++) { cin >> sheepIdx[i]; }; sort(sheepIdx + 1, sheepIdx + k + 1); if (SUBTASK_1::checkSubtask()) return SUBTASK_1::Solve(), 0; if (SUBTASK_2::checkSubtask()) return SUBTASK_2::Solve(), 0; };

Compilation message (stderr)

pastiri.cpp: In function 'int main()':
pastiri.cpp:167:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  167 |         freopen("PASTIRI.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
pastiri.cpp:168:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  168 |         freopen("PASTIRI.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...