点分治
文章平均质量分 53
点分治
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
牛客练习赛81 D.小Q与树 点分治
原题链接:https://ac.nowcoder.com/acm/contest/11171/D目录题意分析Code题意有一棵树,每个节点之间的距离为1,每个节点都有权值,求∑u=1n∑v=1nmin(au,av)dis(u,v)\sum_{u=1}^{n}\sum_{v=1}^{n}min(a_{u},a_{v})dis(u,v)u=1∑nv=1∑nmin(au,av)dis(u,v)分析树上点对统计问题,显然可以用点分治或树上启发式合并乱搞。首先分析这个式子,两个点中的较小值和他们原创 2021-04-26 13:44:09 · 148 阅读 · 0 评论 -
Shortest-path tree HDU - 4871最小路径生成树+点分治
原题链接题意:给定n个点,m条边。要求在图中找到一棵树,使得所有点到1的距离最短,然后给定k个点,要求经过k个点的路程最长,并求出最长的有几条。分析:转换一下题意,大概分为两个子问题1.求出关于1节点的最小路径生成树2.求出经过k-1条边的路径的最长距离和条数对于问题1,我们可以先跑一边最短路,求出所有点的最短路,然后从1开始遍历节点,如果dis[v] = dis[u] + w,那么说明这条边是合法的,我们就把它连上,因为要求按照字典序最小,所以我们把所有的边按照节点标号sort一下就搞定。对原创 2020-11-12 15:12:27 · 196 阅读 · 0 评论 -
【树上点分治4】 Garden of Eden HDU 5977
原题链接题意:给定N个点,K个种类,每个点都有自己的种类,问有多少点对可以覆盖全部的种类看到k的范围很小,不妨利用状压的思想,将每个种类的点转换为1<<a[i],即寻找当前的和是否达到1<<k-1,如果达到,说明k种齐全。这里有一个特殊的处理技巧,可以枚举子集的所有状态。for (int sub = S; sub; sub = (sub - 1) & S) { // sub 为 S 的子集}我们同样可以利用hash的思想,因为a | b = c ,我们可以原创 2020-10-31 19:39:07 · 168 阅读 · 0 评论 -
【树上点分治3】 Ciel the Commander CodeForces 321C
原题链接题意:给定N个守卫,按照A-Z的等级从高到低排布,要求每两个相同等级的守卫的最短路径上都有比他等级高的守卫,问构造的方法。如果对点分治理解很透彻的话,应该可以看出,每次取的根结点无非就是高等级的守卫,因为所有的点对都会经过这个根。再则就是判断impossible的情形,如果点分了26次以上,那么就无解了。#include <bits/stdc++.h>using namespace std;//#define ACM_LOCALtypedef long long ll;原创 2020-10-31 19:26:42 · 154 阅读 · 0 评论 -
【树上点分治2】 D Tree HDU - 4812
原题链接题意:给定N个点,找出乘积为k的路径,输出字典序最小的点对考虑用哈希的做法,同样存从根到所有子节点的路径积。考虑a*b = k,可以转换成a = k / b,但由于考虑MOD,可以先预处理出所有逆元。#pragma comment(linker,"/STACK:102400000,102400000")#include <iostream>#include <algorithm>#include <cstdio>#include <cstr原创 2020-10-31 19:18:41 · 144 阅读 · 0 评论 -
【树上点分治1】Tree POJ 1741
原题链接题意:给定一棵树,要求找出树上两点之间距离不超过k的点对有几个。非常经典的点分治模板题,我们需要找出每一对经过当前根的点对,因此我们可以在找子树的时候把所有的子节点都丢进一个数组里,然后进行排序,利用尺取法选出点对。当然,这样可能会有重复,因为我们要求的是经过根的点对,但可能会有不经过根的点对也被计算进去,因此,利用容斥原理,在遍历每棵子树的时候减去以当前子节点为根的点对数。如果当前A为根节点,我们提前处理出A到所有子节点的距离A : 0B : A->BC : A -> B原创 2020-10-31 19:03:37 · 138 阅读 · 0 评论