Educational Codeforces Round 122 E. Spanning Tree Queries
题目大意:
可以一张个节点条边的无向图,对你进行次询问,每次询问给你一个值,让你求出权值最小的最小生成树,输出所有询问结果的异或和
题目分析:
求最小生成树,我们首先会想到Kruskal算法来求解,但是询问次数特别多,所以每次询问用Kruskal求最小生成树肯定会超时
考虑一下Kruskal算法的过程,如果每次询问的值比原来增加1,但是权值的大小顺序没有发生改变,那么最小生成树边的选择一定不会改变,接下来我们只需要思考一下,什么时候会改变权值的大小顺序
假设有边权值为,当的时候,和的大小顺序不发生改变;而当的时候,权值的大小顺序发生改变,那么最小生成树就有重新选边的必要了。所以我们可以将作为分界点,让其对应一个最小生成树的选边情况。
这样一来,我们先求出这张图中任意两条边的分界点,看作是最小生成树的一种情况,并将该情况的所有边权存储下来,时间复杂度为,数据量最坏为。通过二分来确定询问所在的区间,通过存下来的边权的情况,求出询问的结果,最后得到答案
代码:
copy#include <bits/stdc++.h>
using namespace std;
#define _range(container) container.begin(), container.end()
#define L_B lower_bound
#define U_B upper_bound
constexpr int N = 1e5 + 100;
int n, m;
int cur[N], p[N], cnt;
LL result[N], res;
VI ed, order[N];
struct Edge {
int a, b, w;
} edge[N];
int _x;
inline bool cmp(Edge a, Edge b) {
return abs(_x-a.w) < abs(_x-b.w);
}
int find(int x) {
if (x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
edge[i] = {a, b, c};
}
for (int i = 1; i < m; i++)
for (int j = 0; j < i; j++) {
int mid = (edge[i].w + edge[j].w) / 2 + 1;
ed.emplace_back(mid);
}
// 特殊情况,当询问的x=0,那么问题就变成求最小生成树
ed.emplace_back(0);
sort(_range(ed));
int cnt = 0;
for (auto x : ed) {
_x = x;
sort(edge, edge + m, cmp);
for (int i = 0; i <= n + 1; i++) p[i] = i;
for (int i = 0; i < m; i++) {
int a = find(edge[i].a), b = find(edge[i].b), w = edge[i].w;
if (a != b) {
p[a] = b;
order[cnt].emplace_back(w);
}
}
cnt++;
}
int p, k, a, b, c, x;
scanf("%d%d%d%d%d", &p, &k, &a, &b, &c);
for (int i = 1; i <= k; i++) {
if (i <= p) scanf("%d", &x);
else x = (x * 1LL * a + b) % c;
int t = U_B(_range(ed), x) - ed.begin() - 1;
LL sum = 0;
for (auto e : order[t])
sum += abs(e - x);
res ^= sum;
}
printf("%lld\n", res);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人