正解:最小生成树/虚树

解题报告:

传送门!

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 最小生成树/虚树的更多相关文章

  1. [VIJOS2053][SDOI2019]世界地图:最小生成树+虚树

    分析 可以发现第一列和最后一列永远不会被删除,于是我们可以想到维护前后缀最小生成树,但是直接维护的话显然时间空间两爆炸.(通过上网找题解)可以发现我们关心的只是最左边和最右边两列,而不关心内部的连边情 ...

  2. 洛谷 P6199 - [EER1]河童重工(点分治+虚树)

    洛谷题面传送门 神仙题. 首先看到这样两棵树的题目,我们肯定会往动态树分治的方向考虑.考虑每次找出 \(T_2\) 的重心进行点分治.然后考虑跨过分治中心的点对之间的连边情况.由于连边边权与两棵树都有 ...

  3. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  4. 【BZOJ-3572】世界树 虚树 + 树形DP

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1084  Solved: 611[Submit][Status ...

  5. 【BZOJ-2286】消耗战 虚树 + 树形DP

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2120  Solved: 752[Submit][Status] ...

  6. BZOJ 2286 树链剖分+DFS序+虚树+树形DP

    第一次学习虚树,就是把无关的点去掉.S里维护一条链即可. #include <iostream> #include <cstring> #include <cstdio& ...

  7. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  8. 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 ...

  9. bzoj 3572: [Hnoi2014]世界树 虚树 && AC500

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 520  Solved: 300[Submit][Status] ...

随机推荐

  1. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  2. govendor使用

    一,开发端 前提是有一个已经go get过依赖包,并编译成功的项目. $ go get -u github.com/kardianos/govendor $ cd project_dir $ gove ...

  3. 开源分布式日志系统ExceptionLess部署杂乱笔记 加密

    前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wiki .NET 4.6.1 这个因为我装了VS2015,就没有 ...

  4. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...

  5. SpringBoot Logback配置,SpringBoot日志配置

    SpringBoot Logback配置,SpringBoot日志配置  SpringBoot springProfile属性配置 ================================ © ...

  6. Android Studio开发第一篇QuickStart

    为什么把as的环境开发放在gradle里呢,因为eclipse里装gradle插件还是不够方便,as直接集成了,然后正好as也是大势所趋,学习一下正好. 看到右边Quick Start快速启动栏下面 ...

  7. UML类图中的几种关系的画法和含义

    UML的类图中,一共有以下六大关系: 泛化(Generalization), 实现(Realization), 依赖(Dependence),关联(Association),聚合(Aggregatio ...

  8. J - Intersection

    来源poj 1410 You are to write a program that has to decide whether a given line segment intersects a g ...

  9. Docker简介及Linux下安装

    什么是Docker? Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...

  10. el表达式用==和eq的注意事项

    eq和==一般是一样的,但是注意el表达式中使用==判断的时候不允许有空格,例如: ${job.jobName==requestScope.user.job.jobName?"selecte ...