1 条题解
-
0
自动搬运
来自洛谷,原作者为

happy_lazier
**搬运于
2025-08-24 22:57:29,当前版本为作者最后更新于2025-04-10 12:41:39,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目大意:在两棵树上分别找到一条路径使公共前缀最大。那么可以考虑把其中一棵树制作成类似于字典树的形式,但是值域有点大,所以对于字典树的节点考虑用 map 记录,之后就是在另一棵树上遍历去更新答案了,代码如下
#define _CRT_SECURE_NO_WARNINGS #include <bits/stdc++.h> #include<cstdio> #include<random> #include<cstdlib> #include<algorithm> #include<array> #include<chrono> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> PII; #define fi first #define sc second #define inf 0x3f3f3f3f3f #define all(x) x.begin(),x.end() #define YES cout<<"YES"<<'\n'; #define NO cout<<"NO"<<'\n'; #define Yes cout<<"Yes"<<'\n'; #define No cout<<"No"<<'\n'; #define rep(i, l, r) for (ll i = (l); i <= (r); ++i) #define rep_(i, l, r) for (ll i = (l); i >= (r); --i) using namespace std; std::mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());//ull x=rng() const ll P = 1e9 + 7; const ll Inf = 2e18; const ll M = 1e5 + 7; const ll N = 2e5 + 7; const int dx[5] = { 0,1,0,-1,0 }, dy[5] = { 1,0,-1,0,0 }; const double eps = 1e-6; long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); } long long qmin(long long a, long long b) { long long res = 1; a %= P; while (b) { if (b & 1)res = res * a % P; b >>= 1; a = a * a % P; } return res; } long long inv(long long x) { return qmin(x, P - 2); } inline ll read() { ll x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch>'9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(), x %= P; return x * f; } //char* p1, * p2, buf[1 << 20]; //inline char gc() { if (p1 == p2)p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin); return p1 == p2 ? ' ' : *p1++; } //inline long long read() { // register long long s = 0; register char c = gc(); // while (c < '0' || c>'9') c = gc(); // while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = gc(); // return s; //} ll lowbit(ll x) { return x & (-x); } struct fenwick { vector<int>tr; int n; fenwick(int mx = 0) { n = mx; tr.assign(n + 10, 0); } void init(int mx) { n = mx; tr.assign(n + 10, 0); } void add(int x, int v) { for (int i = x; i <= n; i += i & (-i)) { tr[i] += v; } } int sum(int x) { int ans = 0; for (int i = x; i; i -= i & (-i)) { ans += tr[i]; } return ans; } int rangeSum(int l, int r) { return sum(r) - sum(l - 1); } }; int c[N], d[N]; vector<int>g1[N], g2[N]; map<int, int>mp[N]; int cnt; void dfs(int u, int v, int rt) { for (auto x : g1[u]) { if (x == v)continue; if (!mp[rt].count(c[x])) { mp[rt][c[x]] = ++cnt; } dfs(x, u, mp[rt][c[x]]); } } int dfs2(int u, int v, int dep, int rt) { int ans = dep; for (auto x : g2[u]) { if (x == v)continue; if (mp[rt].count(d[x])) { ans = max(ans, dfs2(x, u, dep + 1, mp[rt][d[x]])); } } return ans; } void solve() { int n, m; cnt = 0; cin >> n >> m; rep(i, 1, n)cin >> c[i]; rep(i, 1, m)cin >> d[i]; int u, v; rep(i, 2, n) { cin >> u >> v; g1[u].push_back(v); g1[v].push_back(u); } rep(i, 2, m) { cin >> u >> v; g2[u].push_back(v); g2[v].push_back(u); } int ans = 0; dfs(1, 0, 0); if (d[1] != c[1]) { cout << 0; return; } ans = dfs2(1, 0, 1, 0); cout << ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t = 1; //cout << fixed << setprecision(3); //cin >> t; //t = read(); while (t--) solve(); return 0; }
- 1
信息
- ID
- 10212
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者