AtCoder Regular Contest 098 F Donation
非常妙的 Kruskal 重构树。
倒序考虑,相当于每次经过一个点必须至少有 元,然后获得 元,并且之后经过这个点都不会再获得钱。令 ,考虑枚举终点 ,并且按 从小到大走,这样我们得到了一个 的做法。
考虑建出 Kruskal 重构树,边 权为 。那么每次从叶结点开始跳祖先,由于点权随着深度递减而递增,所以到达一个祖先 ,最优方案一定是把 子树内所有结点走完再往上走。设 ,一开始有 元,则 跳到 需要满足 。那么每个终点 的最小钱数 就是所有祖先的 的最大值,dfs
求解即可。最终答案还要加上 。
时间复杂度 。
code
/* p_b_p_b txdy AThousandSuns txdy Wu_Ren txdy Appleblue17 txdy */ #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 1000100; const ll inf = 0x3f3f3f3f3f3f3f3fLL; ll n, m, a[maxn], b[maxn], c[maxn], ans = inf; int fa[maxn], ntot, head[maxn], len; struct E { ll u, v, d; } G[maxn]; bool cmp(E a, E b) { return a.d < b.d; } struct edge { int to, next; } edges[maxn]; void add_edge(int u, int v) { edges[++len].to = v; edges[len].next = head[u]; head[u] = len; } int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } void dfs(int u) { if (u <= n) { return; } for (int i = head[u]; i; i = edges[i].next) { int v = edges[i].to; dfs(v); b[u] += b[v]; } } void dfs2(int u, ll val) { if (u <= n) { ans = min(ans, max(c[u], val)); return; } for (int i = head[u]; i; i = edges[i].next) { int v = edges[i].to; dfs2(v, max(val, c[u] - b[v])); } } void solve() { scanf("%lld%lld", &n, &m); ntot = n; ll s = 0; for (int i = 1; i <= n; ++i) { scanf("%lld%lld", &a[i], &b[i]); c[i] = max(0LL, a[i] - b[i]); s += b[i]; } for (int i = 1; i <= m; ++i) { scanf("%lld%lld", &G[i].u, &G[i].v); G[i].d = max(c[G[i].u], c[G[i].v]); } sort(G + 1, G + m + 1, cmp); for (int i = 1; i <= n * 2; ++i) { fa[i] = i; } for (int i = 1; i <= m; ++i) { int x = find(G[i].u), y = find(G[i].v); if (x != y) { int z = ++ntot; fa[x] = fa[y] = z; add_edge(z, x); add_edge(z, y); c[z] = G[i].d; } } dfs(ntot); dfs2(ntot, 0); printf("%lld\n", ans + s); } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现