제출 #694210

#제출 시각아이디문제언어결과실행 시간메모리
694210Do_you_copyMergers (JOI19_mergers)C++17
100 / 100
1302 ms155652 KiB
//Then #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define faster ios_base::sync_with_stdio(0); cin.tie(0); using namespace std; using ll = long long; using ld = long double; using pii = pair <int, int>; mt19937_64 Rand(chrono::steady_clock::now().time_since_epoch().count()); const int maxN = 5e5 + 1; //const int Mod = 1e9 + 7; //const int inf = int n, k; int id[maxN]; int lab[maxN]; vector <int> S[maxN]; int sum[maxN]; pii e[maxN]; vector <int> adj[maxN], adj1[maxN]; int depth[maxN], lift[maxN][20]; int find_set(int u){ return lab[u] < 0 ? u : lab[u] = find_set(lab[u]); } bool unite(int u, int v){ u = find_set(u); v = find_set(v); if (u == v) return 0; lab[u] += lab[v]; lab[v] = u; return 1; } inline int lca(int u, int v){ if (depth[u] < depth[v]) swap(u, v); int k = depth[u] - depth[v]; while (k){ int t = __lg(k); u = lift[u][t]; k ^= 1 << t; } if (u == v) return u; for (int i = 19; i >= 0; --i){ if (lift[u][i] == lift[v][i]) continue; u = lift[u][i]; v = lift[v][i]; } return lift[u][0]; } void dfs(int u, int p){ depth[u] = depth[p] + 1; lift[u][0] = p; for (int i = 1; i < 20; ++i) lift[u][i] = lift[lift[u][i - 1]][i - 1]; for (int i: adj[u]){ if (i == p) continue; dfs(i, u); } } void dfs1(int u, int p){ for (int i: adj[u]){ if (i == p) continue; dfs1(i, u); sum[u] += sum[i]; } if (sum[u] < 0){ unite(id[u], id[p]); } } int leaf; void dfs2(int u, int p){ if (adj1[u].size() == 1) ++leaf; for (int i: adj1[u]){ if (i == p) continue; dfs2(i, u); } } void Init(){ cin >> n >> k; for (int i = 1; i < n; ++i){ int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); e[i] = {u, v}; } for (int i = 1; i <= n; ++i){ cin >> id[i]; S[id[i]].pb(i); } fill(lab + 1, lab + n + 1, -1); dfs(1, 0); for (int i = 1; i <= k; ++i){ int root = S[i][0]; for (int j = 1; j < signed(S[i].size()); ++j){ root = lca(root, S[i][j]); } for (int j: S[i]){ --sum[j]; } sum[root] += S[i].size(); } dfs1(1, 0); for (int i = 1; i < n; ++i){ int u = find_set(id[e[i].fi]); int v = find_set(id[e[i].se]); if (u == v) continue; adj1[u].pb(v); adj1[v].pb(u); } for (int i = 1; i <= k; ++i){ if (adj1[i].size()){ dfs2(i, 0); break; } } cout << (leaf + 1) / 2; } #define debug #define taskname "test" signed main(){ faster if (fopen(taskname".inp", "r")){ freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout); } int tt = 1; //cin >> tt; while (tt--){ Init(); } if (fopen("timeout.txt", "r")){ ofstream timeout("timeout.txt"); timeout << signed(double(clock()) / CLOCKS_PER_SEC * 1000); timeout.close(); #ifndef debug cerr << "Time elapsed: " << signed(double(clock()) / CLOCKS_PER_SEC * 1000) << "ms\n"; #endif // debug } }

컴파일 시 표준 에러 (stderr) 메시지

mergers.cpp: In function 'int main()':
mergers.cpp:131:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |         freopen(taskname".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
mergers.cpp:132:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |         freopen(taskname".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...
#Verdict Execution timeMemoryGrader output
Fetching results...