Educatinal CF #122(Div. 2) E . Spanning Tree Queries
这一场其实有重大的意义,因为是除夕跨年,不过我FST掉大分了(ks)
- 题意:给你一个n点,m条边的带权图,q次询问,每次给你\(x\),每个边权为\(abs(E[i].w-x)\)答案为所有询问最小生成树边权和。然后输出所有询问结果的异或和。
- 思路:
因为\(n(n<=50),m(m<=300)\)很小。而\(k(k<=10^7)\)又很大。所以肯定不能每个询问直接求,这里是把询问的x,分块预处理。
如果有两条边\(w1,w2(w1<w2)\)选1条,原来最小生成树,选边一定选w1,但仔细考虑绝对值情况下,也就只有两种情况:令\(mid=\frac{w1+w2}{2}\)。 当\(x<mid\),就选\(w1\),当\(x=mid\)都可以,当\(x>mid\)选\(w2\),所以\(mid\)的感觉就像一个分解线
因此我们排序且离散化出任意两条边的\(mid\)。对于每个\(mid\)求其最小生成树,存入sum[mid]。当\(x\)属于\([mid[i],mid[i+1])\)之间就可以用这个值。[因为mid实际求的时候用的上取整]
不过我们只求了\(x=mid\)时的mnsum,范围内其它的怎么求呢?
发现如果我们再在\(mid[]\)集合中加入每个边权。发现每个块内每条选的边的权值都是会随着x++,对mnsum=+1/-1的。
证明:如果上面条件不满足,那么一定存在一个边权在(mid[i],mid[i+1])
然而\(mid[]\)包含所有边权,矛盾。
所以处理出dta[mid]表示x++,mnsum的变化。
最后询问的时候二分一下在哪个块。
ps.注意一下边权排序的时候abs相等时,优先选对dta贡献大的(即边权)大的。 - code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=55;
const int M=305;
struct edge {int qs,x,y;ll z;}E[M],A[M];
bool cmp(edge u,edge v) {return u.z==v.z?u.qs<v.qs:u.z<v.z;}
ll sum[M*M],val[M*M];
int cv,tot,fa[N],dta[M*M];
int g_fa(int u) {return fa[u]==u?u:fa[u]=g_fa(fa[u]);}
int main() {
int n,m;
scanf("%d%d",&n,&m);
val[++tot]=0;val[++tot]=1e8+1;
for(int i=1;i<=m;i++) {scanf("%d%d%lld",&A[i].x,&A[i].y,&A[i].z);val[++tot]=A[i].z;}
for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++)val[++tot]=(A[i].z+A[j].z+1)>>1;
sort(val+1,val+1+tot);
cv=unique(val+1,val+1+tot)-val-1;
for(int j=1;j<=cv;j++) {
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++) E[i]=(edge){(A[i].z>val[j])?-1:1,A[i].x,A[i].y,abs(A[i].z-val[j])};
sort(E+1,E+1+m,cmp);
for(int i=1,t=1;i<=m&&t<n;i++) {
int u=g_fa(E[i].x),v=g_fa(E[i].y);
if(u==v)continue;
fa[u]=v;
sum[j]+=E[i].z;dta[j]+=E[i].qs;t++;
}
}
ll xos=0,x;
int p,k,a,b,c;scanf("%d%d%d%d%d",&p,&k,&a,&b,&c);
for(int i=1;i<=k;i++) {
if(i<=p) scanf("%lld",&x);
else x=(x*a+b)%c;
int y=upper_bound(val+1,val+1+cv,x)-val-1;
ll res=sum[y]+1ll*dta[y]*(x-val[y]);
xos^=res;
}
printf("%lld",xos);
return 0;
}
Educatinal CF #122(Div. 2) E . Spanning Tree Queries的更多相关文章
- CF #371 (Div. 2) C、map标记
1.CF #371 (Div. 2) C. Sonya and Queries map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...
- CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Problem 1566 - C - Spanning Tree 动态最小生成树
Problem 1566 - C - Spanning Tree 给出一个联通图,然后每次加一条边,每次需要求最小生成树 1 #include <iostream> 2 #include ...
- CF #376 (Div. 2) C. dfs
1.CF #376 (Div. 2) C. Socks dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...
- CF #375 (Div. 2) D. bfs
1.CF #375 (Div. 2) D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...
- CF #374 (Div. 2) D. 贪心,优先队列或set
1.CF #374 (Div. 2) D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 数据结构与算法分析–Minimum Spanning Tree(最小生成树)
给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST
E. Minimum spanning tree for each edge Connected undirected weighted graph without self-loops and ...
随机推荐
- python-模拟页面调度LRU算法
[题目描述]所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LR ...
- 【weex开发】vue-swipe 滑动组件的使用
一,vue-swipe简介 vue-swipe 是饿了么团队开发的vue专用的轮播图插件: 可以实现简单的图片和view轮播,可控制动画时长,可限制手动滑动: 简而言之,可以实现轮播,也可以实现ppt ...
- mint-ui中messagebox的使用
效果图: 代码: // 安装 # Vue 1.x npm install mint-ui@1 -S # Vue 2.0 npm install mint-ui -S // 引入全部组件 import ...
- JavaSSM-总结
Spring框架技术 SSM(Spring+SpringMVC+Mybatis)阶段的学习,也算是成功出了Java新手村. 前面我们已经学习过Mybatis了. 从这里开始,很多的概念理解起来就稍微有 ...
- Lumia1520 手机刷 Windows10 arm双系统
注意问题 升级到Windows 10 Mobile 的需重新刷回WP8.1,否则解锁会失败 部分手机刷机win10arm后出现屏幕卡死现象,目前除了换屏或重新焊接暂无其他解决方案,请谨慎刷机(当然如果 ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- shell语法习题练习进阶版
第4章 shell语法深度习题练习 4.1 使用if,case,函数的方法将服务改成system(centos6) 4.1.1 if方法 4.1.1.1 system实现 4.1.1.1.1 编写代码 ...
- python基础练习题(题目 斐波那契数列II)
day16 --------------------------------------------------------------- 实例024:斐波那契数列II 题目 有一分数序列:2/1,3 ...
- 【FAQ】接入HMS Core地图服务过程中常见问题总结
HMS Core地图服务(Map Kit)给开发者提供一套地图开发调用的SDK,助力全球开发者实现个性化地图呈现与交互,方便轻松地在应用中集成地图相关的功能,全方位提升用户体验. 在日常工作中,我们会 ...
- python学习-Day5
目录 今日学习内容详解 流程控制理论 程序执行流程分类: 重点小知识* 分支结构(if 语法) 单 if 分支 if 与 else 分支 if 与 elif 与 else 分支 if嵌套 练习 循环结 ...