
分治 & 树分治 & 树链剖分
SuPhoebe
不是我针对谁,我是说在座的诸位都比我强
展开
-
HDU 4456 Crowd (cdq分治)
大意就是给出一个矩阵初始每个位置上的值都为0然后有两种操作一种是更改某个位置上的值另一个是求某个位置附近曼哈顿距离不大于K的所有位置的值的总和网络上众多题解都是 二维树状数组但是这题也被认为是cdq分治的基础题下面提供两种基于cdq分治的解法解法一:将所有点绕原点左旋45°原创 2015-02-14 22:09:08 · 1474 阅读 · 5 评论 -
POJ 2114 Boatherds 点分治
问是否存在长度等于K的路径。就是将统计小于等于K的换成统计等于K的条数,只要最后统计出来的等于K的数量大于0就是存在。其他一点没变,还是那个论文题的点分治。// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorithm>#include <iostream>#incl原创 2015-07-16 09:43:57 · 548 阅读 · 0 评论 -
SPOJ 1825 Free tour II
论文题:在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。 因为所有子树里包含黑点数最多的路径的包含黑点数len可以O(N)求出,我们按照每棵子树的len从小到大的顺序遍历,这样就能将G和F数组降低一维,以G[ i ]表原创 2015-07-20 12:43:52 · 624 阅读 · 0 评论 -
HDU 5221 Occupation
算是一个比较裸的树链剖分。。。但是为什么比赛的时候没人做。。。 树上每个点都有权值 3个操作 1° ans += u~v路径上点权值之和 2° 将点u的权值从ans中剔除 3° ans += 以u为root的子树的点权之和1和2都是树链剖分的基本操作。至于3,如果你是dfs建图的话,那么你剖出来的点的序号终究是他们的dfs序,所以一个u的子树在序中的范围就是id[u] + size[u]原创 2015-08-21 23:44:27 · 786 阅读 · 0 评论 -
HDU 5469 Antonidas【点分治+hash】
首先将串的前缀和后缀分别hash。 然后用树分治。对于树分治,每一个分治的root,我们首先要加上经过root的串匹配出的答案,其次要减去v→root→vv\rightarrow root\rightarrow v这样的串(不合法)。 做了一些剪枝,因为如果ans>0ans>0,则就是匹配到了。 如果都没有则继续进行分治。对于匹配答案,我们记录合法的后缀,然后用前缀去匹配。// wh原创 2015-09-26 20:41:30 · 1729 阅读 · 0 评论 -
Aoj 2450 Do use segment tree【树链剖分】
树链剖分,个人因为姿势太丑就不发代码了。 维护四个域。 区间和,右端最大连续值,左端最大连续值,答案。#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <vector>using namespace std;typedef long long LL;const int原创 2015-10-02 15:32:44 · 587 阅读 · 0 评论 -
BZOJ 3531 旅行【树链剖分】
简单的树链剖分,但是每个教都应该建一个线段树。 因此有可能会爆空间,所以动态申请空间。// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#原创 2015-10-02 15:42:55 · 573 阅读 · 0 评论 -
Hihocoder 1236 Scores【分块+bitset】
对于每一个分数,我们对其进行排序。 然后分成n√\sqrt{n}块,每一块用一个bitset统计有多少人属于这个分数段。 然后对于每一次查询,我们用lowerbound搜出它属于那一块分数段,取出之前分数段的得分情况,然后暴力维护这一分数段。 每一个成绩统计出来的bitset,&到最后就是有多少人输了。count一下就好。注意,每一次的答案都要和上一次异或,强制在线。// whn63原创 2015-09-25 16:41:28 · 802 阅读 · 0 评论 -
HDU 5412 CRB and Queries【整体二分+树状数组】
裸动态区间第K大 据说树套树很容易MLE,要有很厉害的姿势才能够 于是就只能用整体二分代码有加注释,学自这儿// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include <algorithm>#include <iostream>#include <iomanip>#include原创 2015-08-21 11:54:10 · 1542 阅读 · 0 评论 -
POJ 2104【整体二分】
整体二分的想法就是将操作进行分块,将相互影响的操作放在一块。这题要注意分治结束条件 在没有离散化的情况下,就要以操作判断结束条件,当然这题操作数比较小,这样的话也更快。 下面的姿势是重排下标,总感觉重排结构体会慢一些….实际上好像没什么影响// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#i原创 2015-08-27 22:28:47 · 1275 阅读 · 0 评论 -
HDU 5354 Bipartite Graph[cdq+并查集]
这道题和2015年北大校赛第三题几乎一模一样。处理方法也是cdq+可删除并查集。 然后判断是不是二分图的方法,就是用并查集判断是否是二分图,看看我们要merge的两个点的各自与父亲相对的颜色。并查集的基本使用方法。 至于cdq和可删除并查集见链接。 当然不一定要像YYN将所有的以前信息都记录在stack中,也可以只记录两个点,然后再存几个数组表示这个点以前的信息就行。// whn63原创 2015-08-07 20:31:33 · 1216 阅读 · 0 评论 -
HDU 5324 Boring Class【cdq分治】
这就是一个三维排序的问题,一维递减,两维递增,这种问题用裸的CDQ分治恰好可以解决。 如同HDU 4742(三维排序,一个三维都是递增的) 因为最小字典序比较麻烦,所以要从后面往前面做分治,每个点的dp值表示以这个点为起点,最长可以延伸多长。 本来是想按照LiL_i排序,但是这样做在cdq的时候实在是太难以处理了,所以就按照idx排序,也就是不需要排序。 然后按照RiR_i排序,对于左边,保原创 2015-07-28 20:58:07 · 1848 阅读 · 0 评论 -
【openjudge】C15C Rabbit's Festival【CDQ分治+并查集】
传送门:【openjudge】C15C Rabbit’s Festival题目分析:考虑到每条边最多只断一天,我们可以用cdq来模拟这个过程。假设当前区间为[l,r],令m=(l+r)/2,选择[l,m]区间时,我们便将[m+1,r]内的边全部使用掉,然后递归处理[l,m]部分。处理完[l,m]部分后我们将[m+1,r]回溯掉,然后将[l,m]内的边都使用掉,递归处理[m+1,r]转载 2015-05-27 20:28:19 · 791 阅读 · 0 评论 -
POJ 1741(树分治)
论文题:树的点分治// whn6325689// Mr.Phoebe// http://blog.youkuaiyun.com/u013007900#include #include #include #include #include #include #include #include #include #include #include #inc原创 2015-05-27 22:16:31 · 594 阅读 · 0 评论