日常刷题2025-2-27
1.日常刷题2025-3-162.日常训练2025-1-23.日常训练2025-1-34.日常训练2025-1-55.日常训练2025-1-86.日常训练2025-1-117.日常训练2025-1-128.日常训练2025-1-139.日常训练2025-1-1410.日常训练2025-1-1511.日常训练2025-1-1612.日常训练2025-1-1713.日常训练2025-1-1814.日常训练2025-1-1915.日常训练2025-1-2116.日常训练2025-1-2217.日常刷题2025-1-2318.日常训练2025-1-2419.日常刷题2025-1-2520.日常刷题21.日常刷题2025-2-622.日常刷题2025-2-923.日常刷题2025-2-1424.日常刷题2025-2-1525.日常刷题2025-2-1726.日常刷题2025-2-2027.日常刷题2025-2-2128.日常刷题2025-2-2229.日常刷题2025-2-2430.日常刷题2025-2-26
31.日常刷题2025-2-27
32.日常刷题2025-2-2833.日常刷题2025-3-134.日常刷题2025-3-235.日常刷题2025-3-336.日常刷题2025-3-537.日常刷题2025-3-638.日常刷题2025-3-739.日常刷题2025-3-840.日常刷题2025-3-941.日常刷题2025-3-1042.日常刷题2023-3-1143.日常刷题2025-3-1344.非常棒的二分和DP日常刷题2025-2-27
易错点multiset删除元素
使用multiset删除容器中的一个元素时,如果直接erase(a),则会把multiset中所有等于a的元素全部删除。
如果想要达到的效果是只删除一个,则需要这么使用
std::multiset<int> st; int a; st.erase(st.find(a));
I 图中最深的根
思路:换根DP
当题目提到要考查每一个节点作为根节点时的最大高度时,已经很明显的在暗示使用换根DP了。
此题就是最正常的换根DP,没有什么小巧思
#include <bits/stdc++.h> typedef std::pair<long long, long long> pll; typedef std::pair<int, int> pii; #define INF 0x3f3f3f3f #define MOD 998244353 using i64 = long long; const int N = 1e5 + 5; struct DSU { std::vector<int> f, siz; DSU() {} DSU(int n) { init(n); } void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); siz.assign(n, 1); } int find(int x) { while (x != f[x]) { x = f[x] = f[f[x]]; } return x; } bool same(int x, int y) { return find(x) == find(y); } bool merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return false; } siz[x] += siz[y]; f[y] = x; return true; } int size(int x) { return siz[find(x)]; } }; void solve() { int n; std::cin >> n; DSU dsu(n); int cm = n; std::vector g(n, std::vector<int>()); for (int i = 0; i < n - 1; i++) { int u, v; std::cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); if (!dsu.same(u, v)) { dsu.merge(u, v); cm--; } } if (cm >= 2) { std::cout << "Error: " << cm << " components\n"; return; } std::vector<int> f(n), gg(n), dp(n); auto dfs1 = [&](auto self, int cur, int fa) -> void { int mx = 0; for (auto to : g[cur]) { if (to == fa) continue; self(self, to, cur); mx = std::max(mx, f[to]); } f[cur] = mx + 1; }; dp[0] = 0; auto dfs2 = [&](auto self, int cur, int fa) -> void { std::multiset<int> st; for (auto to : g[cur]) { if (to == fa) continue; st.insert(f[to]); } for (auto to : g[cur]) { if (to == fa) continue; st.erase(st.find(f[to])); int mx = 0; if (st.size() == 0) { mx = 0; } else { mx = *st.rbegin(); } dp[to] = std::max(mx, dp[cur]) + 1; st.insert(f[to]); self(self, to, cur); } }; dfs1(dfs1, 0, -1); dfs2(dfs2, 0, -1); for (int i = 0; i < n; i++) { gg[i] = std::max(f[i] - 1, dp[i]) + 1; } int mx = *std::max_element(gg.begin(), gg.end()); for (int i = 0; i < n; i++) { if (gg[i] == mx) { std::cout << i + 1 << '\n'; } } } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t = 1; for (int i = 0; i < t; i++) { solve(); } return 0; }
本文作者:califeee
本文链接:https://www.cnblogs.com/califeee/p/18741369
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步