COGS 2434 暗之链锁 题解
【题意】
给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和一条其他边使得图不连通的方案数。
注意,即使只斩断主要边就可以使得原图不连通,你仍然需要继续斩断一条其他边才能成为一种方案。
【解法】
考虑到原图的一个性质:使得原图不连通的方案只有以下两种情况:
1.主要边是原图的桥
2.主要边和附加边连接的两个连通块只有这两条边相连
显然每个1产生的方案都有m种,每个2产生的方案只有一种。
考虑到原图的主要边构成一棵树并且只有主要边可能是桥,因此想到一个性质:
如果把每条附加边两端点在树上的路径进行标记,那么没有被标记过的边就是原图的桥(注意这里桥一定是主要边),只被标记过一次的边一定对应唯一的一个2。
因此考虑使用树链剖分,再加上区间修改功能,最后查询每条边被标记的次数,那么没有被标记的边就是原图的桥,ans+=m(因为这条边和任意一条附加边组合都是一种方案);只被标记了一次的边对应唯一的一个2,ans++;被标记超过1次的边显然是不能构成方案的(因为砍断它之后它两边对应的两个连通块至少有两条边相连,砍断其中的任意一条边是无法使两个连通块断开的)。
顺便一提,实现区间修改单点查询功能可以使用差分数组,这样单次区间修改O(1),最后逐个查询O(n),再加上树剖单次路径修改O(logn)次,树剖预处理O(n),总的复杂度为O(n+mlogn),比起线段树单次路径修改O(log2n),总复杂度O(nlogn+mlog2n)快了很多,并且代码也更短,常数更小,也很省内存。
【后记】
听出题人(magic_sheep)说本题有好几种解法,然而本鶸渣只想到了一种,其他的还没想出来,在此膜拜神犇。
这个解法的桥和连通块听上去很像图论有关内容,实际上这个树剖解法就是从图论上的桥和连通块发展来的,只不过利用了树的性质,采用树剖实现。因此,我觉得求桥和双连通分量的算法稍加组合和改造应该也是可以解决本题的。
感觉本题很有思想难度,但代码实现却非常容易(我的代码仅仅80+行)。多做做这种题,很有意义。
【8.16增加】
昨天和ad神犇讨论了一下,ad神犇说这个题的路径处理部分不需要树剖,直接用树上差分就行。
具体做法就是把两点那个地方的差分数组++,把LCA那里的差分数组-=2(因为要屏蔽LCA),最后采用一遍dfs或者bfs之后按照bfs逆序处理就行。
LCA可以用Tarjan事先求出,这样LCA的复杂度就是O(n),单次路径处理的复杂度也从O(logn)降到了O(1)。
学到了%%%
COGS 2434 暗之链锁 题解的更多相关文章
- [补档][COGS 2434]暗之链锁
[COGS 2434]暗之链锁 题目 传说中的暗之连锁被人们称为Dark.<!--more-->Dark是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它.经过研究,你发现Dark呈现无 ...
- COGS 2437 暗之链锁 II 题解
[题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和k条其他边使得图不连通的方案数mod109+7的值. 注意,就算你切断一条主 ...
- 【COGS 2434】 暗之链锁 树上差分+LCA
差分就是把一个值拆成许多差的和如 1 2 4 6 9 那么 把这个东西拆成 1 1 2 2 3 就是了,当然也可以理解为对一个问题分解为多个子问题并对其进行操作来得到原问题的答案. 树上差分就更玄妙了 ...
- COGS 08-备用交换机 题解——S.B.S.
8. 备用交换机 ★★ 输入文件:gd.in 输出文件:gd.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直 ...
- COGS 902 乐曲主题 题解 & hash入门贺
[题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数 ...
- cogs.12运输问题2题解
乍一看貌似和运输问题1没有任何区别,但本题有一个有意思的东西叫做下限,我个人称之为非强制下限,因为本题中要求的实际是我走这条边这条边才至少走下限的流,虽然出题人没说,但从样例来看确实是这样的,而强制下 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)
bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...
- LeetCode_1114.按顺序打印(多线程)
LeetCode_1114 LeetCode-1114.按顺序打印 我们提供了一个类: public class Foo { public void one() { print("one&q ...
随机推荐
- Xcode设置
1. 在Search Paths中设置相对路径 径是以.xcodeproj文件为基准,./表示与.xcodeproj同级,../表示上一级 2. 链接动态链接库 设置链接库,在Build Settin ...
- 个人js
1.网页右侧地图浮动楼层,超过100px就显示 $(window).scroll(function(){ ){ //距顶部多少像素时,出现返回顶部按钮 $("#floor").fa ...
- Rendering Paths
渲染路径 Rendering Paths http://game.ceeger.com/Manual/RenderingPaths.html 延迟光照渲染路径的细节 Deferred Lighting ...
- Python 线程、进程和协程
python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...
- DNS域传送漏洞利用
DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因 ...
- 使用VMware 安装Linux CentOS7
访问百度经验 http://jingyan.baidu.com/article/eae0782787b4c01fec548535.html 安装无忧..
- 密钥文件snk
1.(what)是什么? 由一个程序集的标识组成并通过公钥和数字签名(针对该程序集生成)加强的名称,其中的标识包括程序集的简单文 本名称.版本号和区域性信息(如果提供的话). 2.(why)为什么 ...
- @SuppressWarnings的使用、作用、用法
在java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings(“XXXX”) 来解决 例如:@S ...
- 后缀.jar的是什么文件?
解压kafka 打开后是一堆.jar结尾的文件,那么后缀.jar的是什么文件? JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种 ...
- R 字符串处理函数
用R来处理字符串数据并不是一个很好的选择,还是推荐使用Perl或者Python等语言.不过R本身也提供了一些常用的字符串处理函数,这篇文章就对这些字符串函数做一个简单的总结,具体各个函数的使用方法还是 ...