bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| $ . 上虚树. 就是将圆方树构建好后每次询问一个连通块的圆点个数. #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; tem…
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中的圆点个数减去\(S\).问题变成了怎样求这样的连通块中的圆点个数,直接给结论吧:先搞出树的dfs序,把询问的点按dfs序从小到大排一遍序,每次把答案加上第\(i\)和第\(i + 1\)个点之间的圆点个数,但是不算lca,再加上第\(1\)个和第\(S\)个点之间的圆点个数,然后除以二就得到了这个…
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到任意其他城市. 现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这个城市的道路. 只要在摧毁这个城市之后能够找到某两个小C占领的城市u和v,使得从u出发沿着道路无论如何都不能走到v,那么小Q就能赢下这一局游戏. 小Q和小C一共进行了q局游戏,每一局游戏会…
传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有DP,所以其实没有必要将虚树建立起来,只需要维护一个链并就可以了. #include<bits/stdc++.h> //This code is written by Itst using namespace std; inline int read(){ int a = 0; char c =…
题目链接 显然先建圆方树,方点权值为0圆点权值为1,两点间的答案就是路径权值和减去起点终点. 对于询问,显然可以建虚树.但是只需要计算两关键点间路径权值,所以不需要建出虚树.统计DFS序相邻的两关键点间路径权值,最后除以2就好了. 因为这个前缀和统计不到根节点,所以要加上当前虚树的根节点的权值,即(LCA(A1,AK)<=n). 话说这是二轮的题啊?? 为什么我当时不知道圆方树和虚树→_→而且怎么好多人都不知道的样子.. 有些前几了,第一个Rank1..激动 //36624kb 4516ms #…
https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始建的想法就有问题,答案竟然还差不多,查了好久才发现……然后重新想了个正确的建法发现比之前那个错误的建法好写多了,气),然后把这棵树整成虚树再做个树上dp就(安排得)明明白白的了.dp的时候注意一下树的根的值也要统计. 我的程序大概常数太大了洛谷开O2才能过,BZOJ会tle,也不想改了,就这样吧………
先看一道虚树普及题:给你一棵 $n$ 个点的树,$m$ 次询问,每次询问给你 $k$ 个关键点,求把这些点都连起来的路径并的最短长度.$1\le n,m\le 100000,\space 1\le \sum_{k} \le 100000$.…
喜闻乐见的圆方树+虚树 图上不好做,先建出圆方树. 然后答案就是没被选到的且至少有两条边可以走到被选中的点的圆点的数量. 语文不好,但结论画画图即可得出. 然后套路建出虚树. 发现在虚树上DP可以得出答案. 所以在虚树上DP即可. 代码极丑 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespac…
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做起来十分舒服. 仙人掌的基环DP 首先勾出一棵有根生成树. 那么树边上正常转移即可. 我们把返祖边形成的环归到环上深度最浅的点上,即环顶. 那么到环顶时,单独跑一遍关于环的\(DP\)即可. 一般写法为: void dfs(RG int u,RG int From) { dfn[u] = low[u] = +…
P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但我怎么从9点一直调到下午4点啊啊啊啊啊 双倍经验:P4320 道路相遇,但是被卡常了并没有过 给出一个无向图,和 \(q\) 个询问,每次给出 \(s\) 个点,问存在几个点,使得这个点和他相连的边被去除后,这 \(s\) 个点中,至少存在一对点互不相通 先用 tarjan 对原图建立圆方树,然后可…
bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到 任意其他城市.现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这 个城市的道路.只要在摧毁这个城市之后能够找到某两个小C占领的城市u和v,使得从u出发沿着道路无论如何都不 能走到v,那么小Q就能赢下这一局游戏. 小Q和小C一共进行…
Description 给定一张 \(n\) 个点 \(m\) 条边的无向联通图,共有 \(q\) 次操作,每次操作选择一些点作为关键点,询问有多少个点满足删去该点及与其相邻的边后,至少有两个关键点不能互相到达.\(n,q\leq 10^5,m\leq 2\cdot 10^5,\sum|S|\leq 2\cdot 10^5\). Sol 还是挺简单的. 就是圆方树+虚树\(\mathrm{DP}\). 但是让我们看到了未来毒瘤的方向,出题人已经开始把树上问题放到图上了. 先把圆方树建出来,观察到…
传送门 思路 先考虑两点如何使他们不连通. 显然路径上所有的割点都满足条件. 多个点呢?也是这样的. 于是可以想到圆方树.一个点集的答案就是它的虚树里圆点个数减去点集大小. 可以把点按dfs序排序,然后统计相邻两点距离和首尾两点距离之和. 为了防止一个点被统计多次,把点权改为边权,再额外算上lca是圆点的情况. 另外,写完这题之后P4320就是双倍经验了. 代码 #include<bits/stdc++.h> clock_t t=clock(); namespace my_std{ using…
题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情况 P4606 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define…
QWQ深受其害 当时在现场是真的绝望...... 现在再重新来看这个题 QWQ 根据题目所说,我们可以发现,对于每一个集合中的节点,我们实际上就是要求两两路径上的割点的数目 考虑到又是关于点双的题目,而且在图上,我们并没有很好的办法去做. 这时候就要考虑建出来圆方树,然后我们对于圆方树 的每个点,维护他到根的路径上的圆点个数 那么,我们该怎么求两两路径的割点总数呢(一看到数据范围,就想到虚树了啊) 冷静分析一下,发现真的直接把虚树中的点弄出来就是合法的,因为两两的路径一定会通过\(lca\),而…
正题 题目链接:https://www.luogu.com.cn/problem/P4606 题目大意 给出\(n\)个点\(m\)条边的一张图,\(q\)次询问给出一个点集,询问有多少个点割掉后可以是点集中至少一个点对不连通. 解题思路 就是问圆方树上的虚树中的圆点数量,照着统计就好了. 细节有点多,注意不要习惯性的把根节点带进虚树就好了. 时间复杂度\(O(n\log n)\) code #include<cstdio> #include<cstring> #include&l…
https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到任意其他城市.现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这个城市的道路.只要…
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到 任意其他城市.现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这 个城市的道路.只要在摧毁这个城市之后能够找到某两个小C占领的城市u和v,使得从u出发沿着道路无论如何都不 能走到v,那么小Q就能赢下这一局游戏. 小Q和小C一共进行了q局游戏,每一局游戏…
LINK:战略游戏 一道很有价值的题目.这道题 一张无向联通图 每次询问给出K个关键点 问摧毁图中哪个点可以使得这K个关键的两两之间有一对不能联通 去掉的这个点不能是关键点 求方案数. 可以发现 当K==2的时候 我们从一个点到另外一个点 能摧毁的必然是关键点 一张无向联通图 如果是关键点的话 那么必然不存在另外一条路径 所以这个关键点符合割点的定义 我们只需要求出路径上有多少个割点即可. 考虑 K个点怎么做 可以发现建出圆方树 这样两点之间的割点数量就是圆方树上圆点数量.那么我们只要建出虚树按…
题面 先圆方树然后建虚树,答案就是虚树大小.虚树没必要建出来,把原来的点的点权设为1,直接dfs序排序后相邻点求距离加上首尾两个点的距离,最后除以二(画一下可以发现是正反算了两遍),注意还要去掉询问点和补上首尾两个点的LCA #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #define vint vector<int> #define vit vec…
SADPAIRS 删点不连通,点双,圆方树 非割点:没有影响 割点:子树DP一下 有不同颜色,所以建立虚树 在圆方树上dfs时候 如果当前点是割点 1.统计当前颜色虚树上的不连通点对,树形DP即可 2.统计所有颜色的虚树上的不连通点对.... 一个麻烦事是,虚树上一条边上选择一个原树割点,都会对这个虚树造成相同的影响(两边sz乘积) n,m 2e5 树上差分 设虚树上,(x,y)的边,x是y的父亲 原树上,x的位置减去贡献,y的原树father位置加上贡献 最后dfs扫一遍就行了. 实际上麻烦事…
题目链接 本代码10分(感觉速度还行..). 建圆方树,预处理一些东西.对询问建虚树. 对于虚树上的圆点直接做:对于方点特判,枚举其所有儿子,如果子节点不在该方点代表的环中,跳到那个点并更新其val,加入B数组:对于环中的点直接加入B数组. 然后像BZOJ2125一样更新环上的.懒得写拆环的单调队列了,直接用min(abs,len-abs). UOJ特么的数据有毒啊.调不出来了,AC的代码一个比一个码风奇特,还有的贼长..先不调了. 一上午+半下午了..从注释的代码可以看出调的过程多么鬼畜. /…
被CNST的大小卡了好久.一定要开到18呀…… 首先,遇到这种带各种各样环的图先考虑是不是可以建立圆方树,在圆方树上求出答案.然后转化为圆方树之后,我们就将图转化到了树上.答案非常的明显:只要一个圆点位于一个节点到另一个节点的路径上,它就是一个可以选择的答案点. 又观察到数据范围中给出的总和 <= & 多组询问的模式,立马联想到建立虚树.建立出了虚树,我们发现这棵虚树有一个非常妙妙的性质:所有的叶子节点均为指定点.这样的话,在这棵虚树上所有的点(从叶子到根的路径上的点,包括没有建出来的点)均…
题目大意:支持多次操作,增加或删除一个关键点 动态维护虚树边权和*2 分析:可以用树链求并的方法,最后减去虚树的根到1距离 注意到树链求并是所有点到根距离-所有dfn序相邻两点的LCA到根距离 找dfn左右两个点稍微求一下,那就平衡树维护咯 树总根是dfn最小的点和最大的点的LCA ================================================= md智障想偷懒不写平衡树,写了个set,然后gg不会写搞了两个小时 ========================…
题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 \(v\) 也就是把 \(v\) 到根路径上(除了根)所有点的父亲都变成根. 最后查询每个版本的每个点的 \(dep\) 之和. 数据范围 \(n, m, q \le 2 \times 10^5\) 题解 操作顺序是无所谓的,我们假设操作了点集 \(S\) ,那么最后被缩上去的点其实就是 \(\{…
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1868.html 题目传送门 - 51Nod1868 题意 给定一颗 $n$个点的树,每个点一个 $[1,n]$ 的颜色.设 $g(x,y)$ 表示 $x$ 到 $y$ 的树上路径上有几种颜色. 对于一个长度为 $n$ 的排列 $P[1\cdots n]$ ,定义 $f(P)=\sum_{i=1}^{n-1}g(P_i,P_{i+1})$ . 现在求对于 $n!$ 个排列,他们的 $f(P)$ 之和…
树形$dp$利器——"$fake$"树(虚树$qwq$)  前置知识: $1.$$dfs$序 $2.$倍增法或者树链剖分求$lca$  问题引入: 在许多的树形动规中,很多时候点特别多,而又有一些毒瘤操作,导致很多时候,原本优秀的算法变得很鸡肋,而虚树就是解决这种问题的一把利器 那让我们来看一道例题: 洛谷P2495 [sdoi2011]消耗战 一句话题意:给定一棵$n$个节点的树,$m$次询问,每次给出几个点,要你删除若干条边使得这些点不和根节点联通 我们看到数据范围: $n<…
对反串建SAM得到后缀树,两后缀的lcp就是其在后缀树上lca的len值,于是每次询问对后缀树建出虚树并统计答案即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N…
Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和别人打仗了. 在打仗之前,幽香现在面临一个非常基本的管理问题需要解决. 整个地图是一个树结构,一共有n块空地,这些空地被n-1条带权边连接起来,使得每两个点之间有一条唯一的路径将它们连接起来.在游戏中,幽香可能在空地上增加或者减少一些军队.同时,幽香可以在一个空地上放置一个补给站. 如果补给…
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略游戏 https://www.luogu.org/problemnew/show/P4606 [x] [APIO2018]铁人两项 https://www.luogu.org/problemnew/show/P4630 [ ] [SHOI2008]仙人掌图 [ ] [BZOJ4316]小C的独立集 [x]…