CF891C Envy 最小生成树/虚树
正解:最小生成树/虚树
解题报告:
sd如我就只想到了最暴力的想法,一点儿优化都麻油想到,,,真的菜到爆炸了QAQ
然后就分别港下两个正解QAQ
法一,最小生成树
这个主要是要想到关于最小生成树的性质
关于最小生成树,有这么一个性质,就是说,对于任意一种最小生成树的方案,将边权排序得到的序列都是相等的
挺显然的不证了,结合kruscal的过程意会下QAQ
但其实我jio得并不重要,,,其实直接想着全程模拟kruscal的过程就好了QwQ
假如现在在模拟kruscal的过程,已经从小到大加边加到这儿了
然后考虑怎么样就是布星的呢,依然结合kruscal的性质,如果边两端在同一个联通块中它就不应该被选择
也就是说如果给定的边的两端在同一个联通块中说明不成立
否则一定是成立的,因为它是符合kruscal的生成过程的
然后最后说下从小到大加边这个事儿,其实它是不需要像普通的kruscal一样判断在不在一个块内部的,直接连上就好
原因非常简单,如果不在一个块肯定要连上,如果在一个块内反正也不连白不连嘛,连上不可能让局面更劣,所以就把边权小于当前枚举边权的边的两端连起来就好了QwQ
然后关于这里还有一个就,这个要做很多次,所以有两个方法分别港下
第一种就想着开个可持久化并查集嘛,所以不能路径压缩,用个按秩合并
第二种有点儿巧妙,是这样儿的,考虑先把所有边按边权排序,因为不同边权之间互不影响,所以可以预处理出每条边在连完所以边权小于它的边之后它的两端从属于哪两个块,这样就相当于是每次重新构造了一个并查集,就欧克辣QwQ
然后因为我用的第二种所以另外cue下
就是如果先预处理一次然后在线地一个个做好像是会超时的(至少我超时了(可能我打得不够优秀趴QAQ
可以考虑离线,把权值相等的一起做,这里的建议是开个vector,这样比较方便实现QAQ
over
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define rp(i,x,y) for(rg int i=x;i<=y;++i) const int N=5e5+;
int n,m,q,cnt,mx,fa[N],vis[N],fat[N];
struct ed{int fr,to,wei;}edge[N];
bool ans[N];
struct node{int tim,num;};
struct eded{int fr,to;};
vector<node>v[N];
vector<eded>ve[N]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
int fd(int x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
int fdt(int cnt,int x){return vis[x]==cnt?(fat[x]==x?x:(fat[x]=fdt(cnt,fat[x]))):(vis[x]=cnt,(fat[x]=fd(x)));} int main()
{
n=read();m=read();rp(i,,m){int x=read(),y=read(),z=read();mx=max(mx,z),edge[i]=(ed){x,y,z},ve[z].push_back((eded){x,y});}
q=read();rp(i,,q){int k=read();while(k--){int x=read();v[edge[x].wei].push_back((node){i,x});}}
rp(i,,n)fa[i]=i;
rp(i,,mx)
{
int sz=v[i].size(),lst=;
rp(j,,sz-)
{
int ti=v[i][j].tim,x=edge[v[i][j].num].fr,y=edge[v[i][j].num].to;
if(lst!=ti)++cnt;
if(vis[x]!=cnt)vis[x]=cnt,fat[x]=fd(x);if(vis[y]!=cnt)vis[y]=cnt,fat[y]=fd(y);
if(fdt(cnt,x)==fdt(cnt,y))ans[ti]=;fat[fat[x]]=fat[y];lst=ti;
}
sz=ve[i].size();rp(j,,sz-){int x=fd(ve[i][j].fr),y=fd(ve[i][j].to);fa[x]=y;}
}
rp(i,,q)printf(ans[i]?"NO\n":"YES\n");
return ;
}然后这儿是代码w
法二,虚树+树上倍增st表
umm,,,
dbq我太菜了还麻油get这个,,,等get了再来写QAQ
CF891C Envy 最小生成树/虚树的更多相关文章
- [VIJOS2053][SDOI2019]世界地图:最小生成树+虚树
分析 可以发现第一列和最后一列永远不会被删除,于是我们可以想到维护前后缀最小生成树,但是直接维护的话显然时间空间两爆炸.(通过上网找题解)可以发现我们关心的只是最左边和最右边两列,而不关心内部的连边情 ...
- 洛谷 P6199 - [EER1]河童重工(点分治+虚树)
洛谷题面传送门 神仙题. 首先看到这样两棵树的题目,我们肯定会往动态树分治的方向考虑.考虑每次找出 \(T_2\) 的重心进行点分治.然后考虑跨过分治中心的点对之间的连边情况.由于连边边权与两棵树都有 ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
- 【BZOJ-2286】消耗战 虚树 + 树形DP
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2120 Solved: 752[Submit][Status] ...
- BZOJ 2286 树链剖分+DFS序+虚树+树形DP
第一次学习虚树,就是把无关的点去掉.S里维护一条链即可. #include <iostream> #include <cstring> #include <cstdio& ...
- 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)
题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...
- Codeforces Round #328 (Div. 2) D. Super M 虚树直径
D. Super M Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/problem/D ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
随机推荐
- Ubuntu和centos离线安装软件包(apt和yum)
linux安装软件包要解决包依赖问题,不能简单安装包本身. 离线安装基本思想都是先在一台设备上安装下载所有依赖包,然后拷贝所有依赖包到新设备上安装. Ubuntu下apt离线安装包 执行apt upd ...
- [微信开发] 微信JSAPI - 获取用户地理位置信息
参考博客 http://blog.csdn.net/u013142781/article/details/50503299 主要JS 方法 wx.getLocation 获取地理位置信息传递参数 成功 ...
- Linux下搭建LAMP环境(YUM)
安装Apache 1.安装Apache yum -y install httpd 2. Apache配置httpd.conf 通过命令 find / -name httpd.conf 找到Apache ...
- Mysql系列一:SQL入门
csdn博客搬迁 连接数据库:1.在dos窗口下,进入数据库的安装目录的bin目录下,使用mysqld命令启动数据库服务,或者在计算机的服务里面启动mysql服务2.另外打开一个dos窗口,进入数据库 ...
- nginx负载均衡一:基础知识
基础信息 nginx 的 upstream目前支持 4 种方式的分配 1).轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2).weight ...
- lua第三方库
一.Lua 包管理工具 1.LuaRocks luarocks 是Lua常用的包管理工具(还有一个是LuaDist),其安装方式请参考官网:https://luarocks.org/#quick-st ...
- 关于Kafka high watermark的讨论2
之前写过一篇关于Kafka High watermark的文章,引起的讨论不少:有赞扬之声,但更多的是针对文中的内容被challenge,于是下定决心找个晚上熬夜再看了一遍,昨晚挑灯通读了一遍确实发现 ...
- mvc4安装、新建、模版简介
第一安装 mvc4 1.Visual Studio 2012本身就包含MVC4另外无需安装. 2.Vs2010 需要安装vs2010 sp1补丁,后再安装mvc4安装包(官网下载即可) 第二 创建mv ...
- I - Cows
来源 poj 3348 Your friend to the south is interested in building fences and turning plowshares into sw ...
- F - Unix ls
The computer company you work for is introducing a brand new computer line and is developing a new U ...