点分治
文章平均质量分 56
lahlah_
沉浸 尊重
展开
-
luogu P4183 [USACO18JAN]Cow at Large P
https://www.luogu.com.cn/problem/P4183学到许多显然要求出来一个f[u]f[u]f[u]表示离uuu最近的叶子距离考虑对于一个节点的情况,把它设为根求出来以它为根的每个点的深度,记为dep[u]dep[u]dep[u]手玩一下容易发现对于每个节点,叶子是否需要的放判断是f[u]<=dep[u],f[fa]>dep[fa]f[u]<=dep[u],f[fa]>dep[fa]f[u]<=dep[u],f[fa]>dep[fa]原创 2021-12-21 16:02:27 · 22737 阅读 · 0 评论 -
luogu P5311 [Ynoi2011] 成都七中
https://www.luogu.com.cn/problem/P5311首先要注意到一个很重要的性质xxx在原图上的联通快,在点分树上也是一个联通快挺显然的吧然后把询问挂到,点分树x能到达的最浅的祖先上对于每一个点问题转换为求有多少个点到根的颜色区间[l,r]在询问的区间范围内乍一看好像是二维偏序,实际上可以离线的话有更好的做法考虑将询问区间和颜色区间放在一起,按照lll从大到小排序在开个桶,记录每个颜色最小的右端点,用树状数组把把对应位置设成1,维护前缀和即可被教育了QWQcod原创 2021-08-06 13:20:53 · 152 阅读 · 0 评论 -
luogu P6329 【模板】点分树 | 震波
https://www.luogu.com.cn/problem/P6329先建一颗点分树考虑树上的每个节点维护什么因为树高是log的,所以怎么暴力怎么维护就好了维护两个前缀和,uuu的子树的点距离uuu点的距离为iii的个数以及对于fa[u]fa[u]fa[u]的然后一路往上跳,每次加上fa[u]的减去u的即可相当于市点分治的减去重复计算的部分空间处理用vector即可code:#include<bits/stdc++.h>#define N 500050using n原创 2021-08-05 16:59:18 · 205 阅读 · 0 评论 -
luogu P2305 [NOI2014] 购票
https://www.luogu.com.cn/problem/P2305首先考虑无距离限制的转移方程f[u]=min{f[v]+(dis[u]−dis[v])×p[u]+q[u]}f[u]=min\{f[v]+(dis[u]-dis[v])\times p[u] + q[u]\}f[u]=min{f[v]+(dis[u]−dis[v])×p[u]+q[u]}f[u]=min{f[v]−dis[v]×p[u]+dis[u]×p[u]+q[u]}f[u]=min\{f[v]-dis[v]\times原创 2021-04-06 20:46:07 · 122 阅读 · 0 评论 -
浅谈树分治
前言内容大概有点分治点分治两年前好像写过一篇关于点分治的文章(但是菜得很):https://blog.csdn.net/qq_38944163/article/details/81544134用于解决某类树上路径的问题的高效算法算法核心思想: 每次钦定一个点作为根,统计经过这个点的路径的贡献(两端都在子树内),然后这个点各个儿子子树之前不再有贡献,一路分治下去即可(儿子树的互相独立)。在树上钦定的点要保证删掉这个点后最大的连通块节点个数最小,这个点就是树的重心。找重心:首先随便找一原创 2020-05-16 08:35:59 · 382 阅读 · 0 评论 -
树分治(点分治)
点分治主要能解决的问题是树上路径个数的问题。分治也并没有想象中的那么难,就是时间复杂度有点玄学,有的人说是nlog^2n有的说是nlogn,我也不知道具体是多少(反正比n^2暴力快就是了)点分治的思想就是每次取一个重心,然后把每个经过该重心的路径数量算出来(要用容斥,注意重心是否要被计算),对于重心的每个儿子都递归进去做同样的操作,最后累加即可(看代码就懂了)。扔道题题意就是求长度...原创 2018-08-09 21:12:14 · 1556 阅读 · 0 评论