Submission #1277010

#TimeUsernameProblemLanguageResultExecution timeMemory
1277010tvgkUsmjeri (COCI17_usmjeri)C++20
140 / 140
295 ms76640 KiB
#include<bits/stdc++.h> using namespace std; #define task "Direct" #define ll long long #define fi first #define se second #define ii pair<ll, ll> const int mxN = 3e5 + 7, MOD = 1e9 + 7; int n, par[mxN][25], h[mxN], q, cnt[mxN], ans; ii dsu[mxN]; vector<int> w[mxN]; void Pre(int j) { dsu[j] = {j, 0}; for (int i = 1; i <= 20; i++) par[j][i] = par[par[j][i - 1]][i - 1]; for (int i : w[j]) { if (h[i]) continue; h[i] = h[j] + 1; par[i][0] = j; Pre(i); } } int LCA(int u, int v) { if (h[u] < h[v]) swap(u, v); for (int i = 20; i >= 0; i--) { if (h[par[u][i]] >= h[v]) u = par[u][i]; } if (u == v) return u; for (int i = 20; i >= 0; i--) { if (par[u][i] != par[v][i]) { u = par[u][i]; v = par[v][i]; } } return par[u][0]; } int branch(int u, int v) { for (int i = 20; i >= 0; i--) { if (h[par[u][i]] > h[v]) u = par[u][i]; } return u; } void Find(int j) { if (dsu[j].fi != j) { Find(dsu[j].fi); int grp = dsu[j].fi; dsu[j].se ^= dsu[grp].se; dsu[j].fi = dsu[grp].fi; } } bool Union(int u, int v, int tt) { Find(u); Find(v); int uu = dsu[u].fi; int vv = dsu[v].fi; if (uu == vv) return (dsu[u].se ^ dsu[v].se) == tt; dsu[vv].fi = uu; dsu[vv].se = dsu[v].se ^ tt ^ dsu[u].se; return 1; } void DFS(int j) { for (int i : w[j]) { if (i == par[j][0]) continue; DFS(i); cnt[j] += cnt[i]; } if (cnt[j]) ans *= Union(j, par[j][0], 0); } int main() { ios_base::sync_with_stdio(false); cin.tie(); cout.tie(); // freopen(task".INP", "r", stdin); // freopen(task".OUT", "w", stdout); cin >> n >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; w[u].push_back(v); w[v].push_back(u); } h[1] = 1; Pre(1); ans = 1; for (int i = 1; i <= q; i++) { int u, v; cin >> u >> v; int root = LCA(u, v); cnt[u]++; cnt[v]++; u = branch(u, root); v = branch(v, root); cnt[u]--; cnt[v]--; if (u != root && v != root) ans *= Union(u, v, 1); } DFS(1); for (int i = 2; i <= n; i++) { Find(i); if (dsu[i].fi == i) ans = ans * 2 % MOD; } cout << 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...