正解:最小生成树/虚树

解题报告:

传送门!

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. Weka算法Clusterers-Xmeans源代码分析(一)

    <p></p><p><span style="font-size:18px">上几篇博客都是分析的分类器算法(有监督学习),这次就分 ...

  2. HttpWebRequest - Asynchronous Programming Model/Task.Factory.FromAsyc

    Posted by Shiv Kumar on 23rd February, 2011 The Asynchronous Programming Model (or APM) has been aro ...

  3. 嵌入式开发之hi3519---GPIO 按键驱动

    摸索了一个星期,终于把海思HI3515开发板的按键中断程序搞出来了,hi3515的核心芯片与网上例子较多的s3c之类的有一些区别,以至于浪费了好些时间去琢磨.管脚配置方式不一样,中断的使用情况也不一样 ...

  4. vmware-hostd.exe 占用443端口导致Apache无法正常启动?

    问题: [Apache]  Problem detected!16:23:19  [Apache]  Port 443 in use by ""D:\vmware\VMware W ...

  5. 小程序返回顶部top滚动

    wxjs const app = getApp(); Page({ data:{ // top标签显示(默认不显示) backTopValue:false }, // 监听滚动条坐标 onPageSc ...

  6. 8 -- 深入使用Spring -- 5... Spring 3.1 新增的缓存机制

    8.5 Spring 3.1 新增的缓存机制 Spring 3.1 新增了一种全新的缓存机制,这种缓存机制与Spring容器无缝地整合在一起,可以对容器中的任意Bean或Bean的方法增加缓存.Spr ...

  7. Celery第一步

    一. Celery的架构图: task producer - 任务生产者 顾名思义就是发起调度任务的,然后交给任务队列去处理.简单的Python代码.耦合在Django/Flask Web 服务里请求 ...

  8. C++/MFC-线程优先级

    转载: https://blog.csdn.net/qwdpoiguw/article/details/72830426 一.线程优先级(Thread priority ) 简单的说就是(线程)的优先 ...

  9. [原]openstack-kilo--issue(八)NovaException: Unexpected vif_type=binding_failed

    2016-12-06 11:11:22.593 1505 INFO nova.scheduler.client.report [req-43897fe4-800f-436a-a13b-1a0098c8 ...

  10. python 中 try ...except

    捕捉异常 try: 下的代码段 即为 需要捕捉异常的代码段: except:  捕获某一模块的异常,须带异常模块名称,可带原因参数:except 下代码为该异常发生时,所执行的代码:一个try可对应多 ...