Submission #289023

#TimeUsernameProblemLanguageResultExecution timeMemory
289023evpipisMousetrap (CEOI17_mousetrap)C++11
45 / 100
911 ms79868 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back typedef pair<int, int> ii; const int len = 1e6+5, inf = 1e9; vector<int> adj[len], cost[len], order; int block[len], dp[2][len]; int fix_order(int u, int p, int en){ if (u == en){ block[u] = 1; return 1; } for (auto v: adj[u]){ if (v == p) continue; if (fix_order(v, u, en)){ order.pb(u); block[u] = 1; return 1; } } return 0; } int run_dfs(int u, int p){ int mx1 = 0, mx2 = 0, kids = 0; for (auto v: adj[u]){ if (v == p) continue; kids++; int cur = run_dfs(v, u); if (cur > mx1) mx2 = mx1, mx1 = cur; else if (cur > mx2) mx2 = cur; } return mx2+kids; } int main(){ int n, en, st; scanf("%d %d %d", &n, &en, &st); for (int i = 0; i < n-1; i++){ int a, b; scanf("%d %d", &a, &b); adj[a].pb(b); adj[b].pb(a); } fix_order(st, st, en); reverse(order.begin(), order.end()); for (int i = (int)order.size()-1, cnt = 0; i >= 0; i--){ int u = order[i]; //printf("i = %d, u = %d\n", i, u); for (auto v: adj[u]){ if (block[v]) continue; cost[i].pb(run_dfs(v, u)+1); //printf("%d -> %d, cost = %d\n", u, v, cost[i].back()); } sort(cost[i].begin(), cost[i].end()); reverse(cost[i].begin(), cost[i].end()); for (int j = (int)cost[i].size()-1; j >= 0; j--) cost[i][j] += cnt++; } for (int i = (int)order.size()-1; i >= 0; i--){ for (int rem = 1; rem <= i+1; rem++){ dp[i&1][rem] = inf; if (rem >= cost[i].size()) dp[i&1][rem] = cost[i].size() + dp[(i+1)&1][rem-cost[i].size()+1]; int opt = -1; for (int j = 0; j < cost[i].size(); j++){ if (j <= rem && cost[i][j] >= dp[(i+1)&1][rem-j+1]) opt = j; //if (j <= rem) // dp[i&1][rem] = min(dp[i&1][rem], j+max(cost[i][j], dp[(i+1)&1][rem-j+1])); } if (opt != -1) dp[i&1][rem] = min(dp[i&1][rem], opt + cost[i][opt]); else dp[i&1][rem] = min(dp[i&1][rem], dp[(i+1)&1][rem+1]); } } printf("%d\n", dp[0][1]); return 0; }

Compilation message (stderr)

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:86:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             if (rem >= cost[i].size())
      |                 ~~~~^~~~~~~~~~~~~~~~~
mousetrap.cpp:90:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |             for (int j = 0; j < cost[i].size(); j++){
      |                             ~~^~~~~~~~~~~~~~~~
mousetrap.cpp:52:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |     scanf("%d %d %d", &n, &en, &st);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...