正解:最小生成树/虚树

解题报告:

传送门!

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. CentOs 6.x 升级 Python 版本【转】

    在CentOS 6.X 上面安装 Python 2.7.X CentOS 6.X 自带的python版本是 2.6 , 由于工作需要,很多时候需要2.7版本.所以需要进行版本升级.由于一些系统工具和服 ...

  2. Spark学习笔记——构建基于Spark的推荐引擎

    推荐模型 推荐模型的种类分为: 1.基于内容的过滤:基于内容的过滤利用物品的内容或是属性信息以及某些相似度定义,来求出与该物品类似的物品. 2.协同过滤:协同过滤是一种借助众包智慧的途径.它利用大量已 ...

  3. [hadoop] hadoop 运行 wordcount

    讲准备好的文本文件放到hdfs中 执行 hadoop 安装包中的例子 [root@hadoop01 mapreduce]# hadoop jar hadoop-mapreduce-examples-2 ...

  4. 更改linux下文件目录权限、拥有者及用户组

    在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建者,谁创 ...

  5. 【SpringCloud微服务实战学习系列】客户端负载均衡Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的RES模板 ...

  6. gitlab的rack-attack机制和如何设置白名单的记录

    目标gitlab是使用源码安装的10.5中文版 大纲: gitlab rack-attack 机制的作用 如何启用和禁用gitlab的rack-attack机制,以及如何配置白名单 如果一个ip被错误 ...

  7. java注解和反射学习

    spring框架很多地方都应用了注解,如@controller,所以要学会自定义注解及注解处理器. Class<?> cl=Class.froName(className) //通过类名加 ...

  8. day_5.07py

    正则:

  9. Jenkins Docker安装及Docker build step插件部署配置

    生产部署环境:A:192.168.1.2 B:192.168.1.3  两台服务器系统均是Centos 7.3 , Docker版本都1.12.6 Jenkins安装操作步骤: 1.在A服务器上使用命 ...

  10. C# MVC+EF—结构搭建

    近期做了MVC+EF的项目,现在项目完结了,抽个时间写个小DOM总结一下,顺便加深理解. 一.新建MVC项目,结构是这样的