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] ...
随机推荐
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
Add an Arbiter to Replica Set 在集群中加入仲裁节点,当集群中主节点挂掉后负责选出新的主节点,仲裁节点也是一个mongo实力,但是它不存储数据. 1.仲裁节点消耗很小的资源 ...
- 重新入坑-IntelliJ Maven
写Restful的服务,使用IntelliJ+maven,发现有几个依赖总是没法配置好.通过检查POM.xml,发现犯了错误,<dependency>写到了<dependencies ...
- 对TextFile格式文件的lzo压缩建立index索引
转自:http://blog.csdn.net/yangbutao/article/details/8519572 hadoop中可以对文件进行压缩,可以采用gzip.lzo.snappy等压缩算法. ...
- java获取视频缩略图
近期由于在做一个关于视频播放的项目,需要使用程序自动获取视频文件的缩略图,特写此文供其他人参考,有不清楚之楚可以给我留言. 1.使用工具:ffmpeg, 官网下载地址:http://ffmpeg.or ...
- session一直报错Session store not set on request
Route::group(['middleware' => ['web']], function () { //});仍然报错,看了 session是使用默认file,没问题:app/stora ...
- 设计模式-结构型模式,python桥接模式
桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接 ...
- asp.net mvc 3.0 知识点整理 ----- (3).HtmlHelper(Html 辅助方法)介绍
在View视图中,Html的类型是System.Web.Mvc.HtmlHelper<T>, 所有的辅助方法都需要和ModelState交互.那么,ModelState是什么呢?它是模型绑 ...
- Spark注册UDF函数,用于DataFrame DSL or SQL
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object Test2 { def ...
- 6.25python线程问题
#encoding=utf-8 #2018-6-25 20:34:48 #解决耦合的问题#用队列解决这种问题,起到了缓冲的作用 import threading import time # #pyth ...
- shell特殊变量,记录一下
$0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传递给脚本或函数的所有参数. ...