
分治
Mr.Gzj
这个作者很懒,什么都没留下…
展开
-
hdu 5977 Garden of Eden(点分治枚举路径模板)
题意:一棵树,有n(n≤50000) 个节点,每个点都有一个颜色,共有k(k≤10) 种颜色,问有多少条路径可以遍历到所有k种颜色?(一条路径交换起点终点就算两条哦) 思路:这个点分治很好想到,不过如何判断一条路径上是否包含所有k种颜色是一个问题。但看到k很小,考虑状态压缩,最多有(1<<k)-1种状态,利用点分治可以算出从根节点到所有子节点的路径,或运算可记录经过的路径,将...原创 2019-10-30 15:31:14 · 215 阅读 · 0 评论 -
Educational Codeforces Round 64 (Rated for Div. 2)
题意:给出n个1数,是1-n的排列,求区间最大值==区间端点和的区间的个数。 思路:RMQ+分治。1-n的排列,我们就可以记录位置,然后用分治来解决; #include<bits/stdc++.h> using namespace std; const int MAXN = 2e5 + 10; int n, num[MAXN], pos[MAXN]; int F_Max[MAXN...原创 2019-05-02 12:30:30 · 229 阅读 · 0 评论 -
hdu6701Make Rounddog Happy(启发式合并)
题意 给出一个数组,要求有多少对(l,r),使得a[l]...a[r] 之间无重复元素,且max(al,al+1,…,ar)−(r−l+1)≤k 思路 启发式合并,st表处理出每个区间最大值所在位置,然后求出每个点不重复的左右区间。 暴力扫描短的一半计数。 #include<bits/stdc++.h> #define ll long long using namespac...原创 2019-08-25 18:19:24 · 219 阅读 · 0 评论 -
POJ1741Tree(树的点分治)
题意: 给出一颗树,求树上的两点间最近距离不超过k的点对数量。 思路: 对于一条树路径 只有经过或不经过一个点的情况,对于不经过的情况,把一棵树按这个点拆成好几棵分治就行了,考虑经过这个点的情况,对于这题 可以对这个点延伸出的几棵子树各做一次dfs,记录子树中出现的距离值,对于一棵树的距离值数组,把它排序求一次ans1,再对每棵子树分别求一个自己对自己的ans2,(ans1−∑ans2)(ans1...原创 2019-10-01 22:15:31 · 232 阅读 · 0 评论 -
P3806 【模板】点分治1 (点分治求树上是否存在长为k的路径)
思路: 离线求,把询问的1到m1到m1到m存入pre数组里,设当前根节点为rtrtrt,当前子树viv_ivi,求出viv_ivi的每个子节点到rtrtrt的距离dep[i]dep[i]dep[i],令isisis数组存从v0v_0v0到vi−1v_{i-1}vi−1里是否存在某个节点到rtrtrt的距离为pre[i]pre[i]pre[i],若有,则表示路径长为pre[i]pre[i]p...原创 2019-10-02 00:16:27 · 167 阅读 · 0 评论 -
P2634 [国家集训队]聪聪可可 (点分治)
题意:给出一棵树,求树上任意两个节点的距离为3的倍数在所有距离里占的比例。 思路:点分治求距离为3的倍数的点对有多少。 #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 4e4 + 10; int n, h[N], cnt, sz[N], rt, vis[N], mx, ...原创 2019-10-02 22:46:14 · 132 阅读 · 0 评论 -
A. Awesome Shawarma 点分治求小于k路径数
传送门 题意:给出一棵树,你可以在树上两点间任意加一条边,即使原先也有边也无关,让你求加完边后图的桥数在[l,r]的点对数目。 思路:点分治求小于k的路径数,树上加一条边即意味着成环,即少了k个桥,即l<=n-1-k<=r,即k<=n-1-l&&k>=n-1-r,n很大,记得开long long #include<bits/stdc++.h&g...原创 2019-10-03 00:03:30 · 232 阅读 · 0 评论 -
亚洲区预赛(沈阳)网络赛 D . Fish eating fruit (点分治 求不同种路径的和)
题意 : 输入一棵树, 输出树上两点之间距离和模3等于 0, 1, 2的长度之和对 1e9 + 7取模后的结果 思路: 点分治,在calc函数里多维护了当前根节点下除本子树外其他子树的路径长度%3后等于0,1,2的路径数和路径总长度,与本子树的路径长%3后相加再%3,记得最后再乘2,因为同一条路径有两种走法。 #include<bits/stdc++.h> #define ll lon...原创 2019-10-07 22:21:12 · 251 阅读 · 0 评论