![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树相关
文章平均质量分 66
ModestCoder_
一个modest的coder
展开
-
【题解】LuoGu7073:表达式
原题传送门我觉得,这道题目主要考察的还是把后缀表达式转成一棵树然后遍历一遍树求出每个节点的值然后暴力改动每个节点的值,往上跑,如果某一个时刻新算的值跟原来一样,那么就不用进行下去,否则继续结果果然只T了一个点,然后我开了O2就过了Code:#include <bits/stdc++.h>#define maxn 1000010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];int n原创 2020-11-30 21:30:30 · 169 阅读 · 0 评论 -
【题解】LuoGu4657:[CEOI2017]Chase
原题传送门扔磁铁得到的收益有两种情况我在起点,扔一个磁铁,周围的权值是收益,因为周围的那些铁块我肯定不会遇到,而追逐者肯定会遇到我从某一个点走过来,假设上一个点是红点,现在我在绿点,然后我扔了一个磁铁,我获得的收益是周围点的权值和减去红点的权值,因为我是经过了红点的,遇到过红点的铁块,而且追逐者也肯定会遇到所以一条路径上,扔磁铁获得的收益有两种情况而且我们可以发现,假如我从某一个点出发,一定要扔一个磁铁。或者说,我扔第一个磁铁的地方,一定是出发点思考树形dp,遍历到某个点uuu的时候,计算原创 2020-11-30 09:02:10 · 190 阅读 · 0 评论 -
【题解】模拟赛11.22T2 树
考虑已经在两棵树都找到了最优点d1,d2d1,d2d1,d2,每棵树内部的贡献再说,若是在d1,d2d1,d2d1,d2之间连边,需要求得树1的点−>d1−>d2−>树2的点树1的点->d1->d2->树2的点树1的点−>d1−>d2−>树2的点的贡献如果我们知道树1的点−>d1树1的点->d1树1的点−>d1的总贡献是sum1sum1sum1,树2的点−>d2树2的点->d2树2的点−>d2的总贡献是sum2s..原创 2020-11-22 19:31:16 · 145 阅读 · 0 评论 -
【题解】LuoGu6417:mafija
原题传送门思路源自luogu初赛模拟卷贪心从每个入度为0的点开始遍历,删边整张图就剩下一些环,再处理一下环的情况Code:#include <bits/stdc++.h>#define maxn 500010using namespace std;int n, d[maxn], nxt[maxn], vis[maxn], ans;inline int read(){ int s = 0, w = 1; char c = getchar(); for (; !isdigi原创 2020-10-21 20:27:57 · 147 阅读 · 0 评论 -
【题解】LuoGu6147:[USACO20FEB]Delegation G
原题传送门这道题是赛道修建赛道修建赛道修建的弱化版枚举KKK这里有两个优化KKK必须是(n−1)(n-1)(n−1)的因数KKK必须小于等于直径对于每个KKK,判断是否合理,那么就跑一遍树对于某一个点,下面有一堆儿子剩下来的链对于每条链,设长度为xxx,那么必须有一条长度为K−xK-xK−x 的链与之配对,否则这条链就必须跟着自己这个点一起往上传但是如果有多条链无法配对,跟着自己上传的链又最多只能有一条,那么就不合理Code:#include <bits/stdc++.h&g原创 2020-09-27 19:34:53 · 247 阅读 · 0 评论 -
【题解】CF1000G:Two-Paths
原题传送门这道题目和保卫王国非常的相似倍增dp记lll为w(u,v)w(u,v)w(u,v)fuf_ufu表示,从uuu出发回到uuu,走以uuu为根的子树的答案fu+=max(0,fv−2l)f_u+=max(0,f_v-2l)fu+=max(0,fv−2l)fau,ifa_{u,i}fau,i表示,从uuu,往上的第2i2^i2i个祖先dpu,idp_{u,i}dpu,i表示,从uuu跑到fau,ifa_{u,i}fau,i,中途可以跑子树的答案dpu,i=dpu,i−1+原创 2020-09-24 19:45:42 · 186 阅读 · 0 评论 -
【题解】牛客206091:小王子
原题传送门一个正确的暴力思路是遍历树,然后对于每个点,把它和它父亲之间的边断掉。那就看看,边集E2E2E2中有多少条把两个连通块联通的,记条数为cntcntcntcnt=0cnt=0cnt=0,说明E2E2E2中每一条边都可以选择,答案累加mmmcnt=1cnt=1cnt=1,那就只能断掉那一条边,答案累加1cnt>1cnt>1cnt>1,没有边可以断如何统计这个cntcntcnt?可以暴力并查集,但是我们可以树上差分对于一条E2E2E2中的边(u,v)(u,v)(u,v原创 2020-09-16 11:03:29 · 236 阅读 · 0 评论 -
【题解】CF455C:Civilization
原题传送门对于两个连通块连起来,肯定是在两个直径中点之间连一条边使得新的直径最短并查集维护连通性,同时记录连通块的直径大小令两个连通块的直径分别为lens1>lens2len_{s1}>len_{s2}lens1>lens2则新的直径是max(lens1,lens1+12+lens2+12+1)max(len_{s1},\frac{len_{s1}+1}{2}+\frac{len_{s2}+1}{2}+1)max(lens1,2lens1+1+2lens2+1+1)原创 2020-09-09 21:20:41 · 216 阅读 · 0 评论 -
【题解】LuoGu6623:[省选联考 2020 A 卷] 树
原题传送门考虑一个点上的数对整体产生的贡献因为是亦或,考虑某个数每个位对整体产生的贡献加入一个点上的数为3,把这个3,以及它对祖先的贡献形式写出来位数从右往左为0123……3 00114 01005 01016 01107 01118 10009 100110 101011 101112 110013 110114 111015 1111单独取出第1位二进制数,发现是有规律的:1001100110011……第1位,01的循环节长度为222^222,每个循环节中,0/1重原创 2020-09-08 21:03:21 · 256 阅读 · 0 评论 -
【题解】LuoGu4408:[NOI2003]逃学的小孩
原题传送门本来想的一个O(n2)O(n^2)O(n2)的暴力枚举CCC,把它记为根,在dfsdfsdfs枚举lca(A,B)lca(A,B)lca(A,B)求出firu,secufir_u,sec_ufiru,secu表示以uuu为根的子树中最长链,次长链再记dud_udu为深度,那么对于一个(C,lca(A,B))(C,lca(A,B))(C,lca(A,B))的答案是firu+2secu+dufir_u+2sec_u+d_ufiru+2secu+du其实可以只枚举lca(A,B)l原创 2020-09-06 19:34:06 · 266 阅读 · 0 评论 -
【题解】LuoGu6142:[USACO20FEB]Delegation P
原题传送门跟赛道修建很像的一道题目不同的是,现在要全选依然二分答案,然后dfsdfsdfs对于某点的所有儿子里面传上来的链,二分出能和自己组成一条链的往上传,剩下的是通过两两贪心组合判断可行性注意两个点,若有偶数条链,加一条长度为0的链;根节点直接判断可行性Code:#include <bits/stdc++.h>#define maxn 100010using namespace std;struct Edge{ int to, next;}edge[maxn <原创 2020-09-04 21:15:20 · 217 阅读 · 0 评论 -
【题解】LuoGu1084:疫情控制
原题传送门需要用mmm个点封死一棵树答案满足二分性,直接二分本题难点在于checkcheckcheck贪心思想:驻扎到深度越小的点越优通过倍增上提军队,有些军队在二分的mid范围内走不到根节点,那么他就驻扎在能走到的最上的地方有些军队可以,那么他们暂时在根节点休息一会儿,接着从根节点往下走到需要帮助的深度为2的点(根据贪心思想)通过一开始走不到根节点的点可以先处理出哪些深度为2的点其...原创 2019-11-15 10:28:42 · 218 阅读 · 0 评论 -
【题解】CF1059E:Split the Tree
原题传送门首先易知,某个点的权值大于S时,是-1情况贪心策略,在树上跑时,某个点有一堆儿子,肯定是和向上扩展能扩展得最远的儿子结合成一条链如果知道了每个点向上扩展最多能扩展到哪里,那么问题是多么简单啊!只需要记录每个点属于的链的顶端,dfs的时候看看能不能挑出属于链顶端深度最小的儿子,可以就把自己归到那条链,否则自己新开一条链至于如何得到每个点向上扩展最多能扩展到哪里,这个可以用倍增预处...原创 2019-07-29 12:47:10 · 263 阅读 · 0 评论 -
【题解】BZOJ3257:树的难题
原题传送门这真是一道难题qwq看了%%%Claris的题解后懂了树形DP先设置状态,dp[u][i][j]dp[u][i][j]dp[u][i][j]表示以u为根的子树中黑点iii个,白点jjj个,的答案首先优化空间,i>=1i>=1i>=1的情况等价于i=1i=1i=1,反正都是不满足要求的j>=2j>=2j>=2的...原创 2019-07-25 12:22:42 · 265 阅读 · 0 评论 -
【题解】CF68D:Half-decay tree
原题传送门这道题目不难发现总共qqq个询问,每次询问最多涉及到hhh个点,所以总共最多设计到qhqhqh个点可以用mapmapmap把以每个点为根的子树权值之和记录下来修改操作直接把自己到根路径上所有点修改查询操作不妨反向思考,从根节点开始往下断边,因为是二叉树所以每次只有两种断边可能,对应权值可以求出由于期望的线性性直接加起来终止条件是当前的最大值大于等于当前节点的map值Cod...原创 2019-08-03 18:02:26 · 224 阅读 · 0 评论 -
【题解】CF191C:Fools and Roads
原题传送门我记得有一道题目叫做“最大流”(可不是网络流)那道题目是询问每个点经过了几次这道题目是每条边经过了几次同样是裸的树上差分但是边和点的差分是不一样的边是++power[u],++power[v],power[lca]-=2点是++power[u],++power[v],--power[lca],--power[fa[lca]]这道题还要一个以点代边的操作是不是特别水啊C...原创 2019-08-01 11:46:37 · 268 阅读 · 1 评论 -
【题解】绍兴一中-7.27-T2
传送门首先能发现一个性质:如果一棵子树没有花,那么这棵子树不分叉根据这个可以发现,若一个点的所有子树都变成链,那么需要挂的花的个数是子树数-1有了这个可以树型DP,任选一个点为根,根是要挂花的,DP出所有点的答案但是如果根不同,答案也可能不同所以枚举所有点为根的情况,O(n)O(n)O(n)跑DP复杂度为O(n2)O(n^2)O(n2)不行,考虑优化换根操作这是一个非常妙的技巧任...原创 2019-07-28 12:29:54 · 228 阅读 · 0 评论 -
【题解】LuoGu1131:[ZJOI2007]时态同步
原题传送门这道题目可以放到普及T4难度树型DP,记两个数组dp[u]dp[u]dp[u]表示处理完自己为根的子树所需代价len[u]len[u]len[u]表示处理好自己的儿子后的最大深度转移方程:dp[u]=∑dp[v]+∑(max(len[v]+w[u][v])−(len[v]+w[u][v])),(v=uson)dp[u]=\sum_{}^{}dp[v]+\sum_{}^{}(ma...原创 2019-07-28 17:17:32 · 168 阅读 · 0 评论 -
【题解】LuoGu2607:[ZJOI2008]骑士
原题传送门基环树的树形dp对于处理基环树,我本来认为只能先把树的部分处理好之后,在环上把信息综合起来,不过这题非常麻烦基环树有另一种处理信息的方法,就是断环把环找出来之后,从中间断掉他,分别以两个断点为根做树形dp,取答案大的那个累加到最终答案里Code:#include <bits/stdc++.h>#define LL long long#define maxn 1...原创 2019-08-16 12:28:24 · 145 阅读 · 0 评论 -
【题解】LuoGu4949:最短距离
原题传送门基环树,不是特别的复杂如果先把一条多余的边拿掉,然后对于每个询问最短路径不经过多余边,直接树上求两点间距离最短路径经过多余边,树上求多余边两端点分别到两个询问点的距离,加上多余边长度两种情况比大小即可至于如何求得树上两点间距离,因为有修改操作无法直接倍增解决所以用上树剖,然后距离可以用常数更小的树状数组维护一下Code先鸽着...原创 2019-08-13 08:18:49 · 228 阅读 · 0 评论 -
【题解】9.26模拟赛T2
用类直径,找出最远的两个手机店,求出这两个手机店的可行区间求交就好了证明感性/画图皆可Code:#include <bits/stdc++.h>#define maxn 30010using namespace std;struct Edge{ int to, next;}edge[maxn << 1];int num, head[maxn], node...原创 2019-09-29 10:46:39 · 146 阅读 · 0 评论 -
【题解】CF700B:Connecting Universities
原题传送门直接贪心就好啦对于某一条边,如果他的左边有xxx个大学,右边有yyy个大学那么他对答案的贡献是一定的:min(x,y)min(x,y)min(x,y)发现x,yx,yx,y还有一个等式:x+y=2kx+y=2kx+y=2k好了,我们只需要遍历一遍,并且求出一个点某一个方向的大学个数即可(另一个方向直接用2k去减)Code:#include <bits/stdc++.h...原创 2019-07-23 16:02:22 · 263 阅读 · 0 评论