游荡的孤高灵魂不需要羁绊之处。

洛谷题单

点分治

前置芝士

树的重心

树分治

例题略解

P3806 【模板】点分治1

板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个节点的距离,在对应的ans数组加一;然后再接着扫子节点,并把儿子节点子树的贡献减去,最后回答询问。

然后我们愉快的\(TLE60pts\),题目上也有说明,这种做法使用于大部分不过本体比较卡时间,储存然后离线剪枝就好了。

这里给出\(60pts\)的\(code\)

P2634 [国家集训队]聪聪可可

luogu的数据有那么亿点水,我点分治打假了(find函数x打成了i,Divide函数to打成了x)都没事。。。

和上一题差不多,就是存储不同,对于mod3不同的余数进行储存,然后给自己加一个\(p_0^2+2\times p_1\times p_2\)扫到儿子再减去儿子的这个值就好了

\(code\)

P4149 [IOI2011]Race

乍一看这不上面的模板题嘛,然后愉快的WA0pts。

这个题不一样的一点就是维护距离的同时还需要再维护一个边数,还是和前面的题一样,整一个桶储存更新,然后对于距离大于k的剪枝,再注意一下桶的数组大小。

还有就是solve函数里记得跳过访问过的节点 (别问我为啥知道,TLE90挺好的)

\(code\)

P4178 Tree

看着是个板子题,其实不然。。

讲了点分治的一种新方法(至少我没听过)染色法

大概就是把每一棵搜到的子树标记上一种颜色,然后对于想要求的一棵子树根据dis由小到大排序后压入双段队列 (队列好像本来就是双端的),然后一个一个弹出来,更新就行了。

\(code\)

U164635 [BZOJ3697]采药人的路径

思路有一点妙,先是把阴也就是边权为0的边化为-1。我们求出每个结点到根节点的路径和dis,如果这条路径上有两个结点的dis相等,就说明有一段的路径和为0,即这个路径上可以设置一个休息站。

然后开一个\(f[i][0/1]\)和一个\(g[i][0/1]\)分别表示dis为i的正在运算子树和其他子树是否可以建休息站。对于下标为负数的情况直接给所有下标都加上一个n就好了。

\(code\)

P3714 [BJOI2017]树的难题

单调队列优化的比较好的题解

单调队列优化太难搞了。。线段树合并比较好。。

对于树上的各个链,状态无非三种

  1. 过根节点,在两棵子树里。
  2. 在一棵子树里
  3. 过根节点但是在一棵子树里

对于以上三种状态的话,还是第一种实现难度比较大,但是我们可以分类讨论,并且记录上一条边的颜色与现在扫到的边进行判断,因此我们需要对于一个节点的几条边排一下序,就不能用前向星存边了,用vector数组就好了。。

线段树建立在长度上,对于种类进行维护,为了降低复杂度并且按深度运算,我们采用BFS来实现,线段树合并一下就好。

\(code\)

cdq分治

前置芝士

cdq分治1

cdq分治2

例题略解

P3810 【模板】三维偏序(陌上花开)

板子题,但是由于我看了上面的blog,一下午都整到这一个题上了,所以对于上面的blog,看看思路就好...

先对于a排序,然后运用归并排序的思想,对于整个区间进行多次二分,计算贡献,然后就是代码实现了,我也啥也不想说了,吐了。。

\(code\)

P4390 [BOI2007]Mokia 摩基亚

当然正解是cdq分治 (当然权值线段树+分块也能过),本来我打算二维分块的,后来一想这不是cdq专题么,水过去不合适(绝对不是我懒得打分块!绝对不是!)

运用前缀和的思想,所求正方形的就是大的正方形减去两个矩形,然后再加上小的正方形,注意一下边界问题就好了,一开始排序的时候第1.2.3.4关键字分别为:横坐标,纵坐标,时间,贡献。然后愉快地cdq分治就好了。

\(code\)

P4169 [Violet]天使玩偶/SJY摆棋子

我太菜了,调了一晚上最后还是TLE,吸了口氧气才过,差点就用双指针了,最后发现是一开始opt整成了0而不是1(雾。

比较妙的一个地方就是扫的时候只扫左下方的点然后将各个象限翻到第三象限同样的处理,然后就和之前的题目类似了。

\(code\)

P3157 [CQOI2011]动态逆序对

还是cdq分治以时间先排个序,然后在进行维护,唯一不同的点就是为了减小时间复杂度,先整出后来删掉后序列的逆序对,然后向前累加就好了。

\(code\)

P4093 [HEOI2016/TJOI2016]序列

中序遍历按照项从小到大转移,因此不用重新排序,另外我们分别用maxn和minn分别记录每一项的最大值以及最小值,然后用一个f数组记录以i结尾最长上升子序列的长度,然后哦cdq分治。

\(code\)

(动态)点分树

前置芝士

动态树分治

例题略解

P3241 [HNOI2015]开店

啥也不想说了,这破题,看yxc的讲解视频,看的差不多半个下午才感觉凑合懂了一点;然后尝试自己实现,然后又一次打开了他的视频。然后视频+VsCode=半个下午,共计一个下午,终于干出来了。

大概思路就是对于点u到v的距离,可以看作一个重心的两个子树里的两个点之间的距离,然后无限递归,直到u是某个树的重心为止,然后对于u到n个不同的v的距离,可以发现u到重心的路是必须经过的

因此我们可以暴力加和其他部分,然后对于重复的部分直接数量乘上长度就好了。为了查询更方便,我们对于每一个节点开两个vector数组分别用来维护自己和儿子,然后push_back进去一个-1和A+1当作两个边界,然后码就好了。就是这么简(du)单(liu)。

还有就是auto这种东西最好少用。。。

\(code\)

P3345 [ZJOI2015]幻想乡战略游戏

一篇码风比较好的blog

和上面那个题有一些相似,就是找带权重心嘛,也是开了两个vector分别记录某个节点的祖先以及子节点,然后就是一堆板子类的东西,求出size,重心那一类的东西。

最后在各个节点尝试枚举儿子,儿子的节点状态从父亲直接转移,需要多看一下初始化的主函数,细节比较多。。。

  • 注意:不要全开long long 不然虽然在Luogu可以AC,但是在本地以及别的OJ(比如我们的校内OJ)就玄乎了。

\(code\)

点分治&cdq分治 总结的更多相关文章

  1. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  2. UOJ #7 NOI2014购票(点分治+cdq分治+斜率优化+动态规划)

    重写一遍很久以前写过的题. 考虑链上的问题.容易想到设f[i]为i到1的最少购票费用,转移有f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i]} (dep[i]-dep[j ...

  3. [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][ ...

  4. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

  5. 一篇自己都看不懂的CDQ分治&整体二分学习笔记

    作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...

  6. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  7. cdq分治略解

    前言 陌上花开,可缓缓归矣                         --吴越王 寓意:意思是:田间阡陌上的花开了,你可以一边赏花,一边慢慢回来. 隐意:春天都到了,你怎么还没有回来.形容吴越王 ...

  8. 『cdq分治和多维偏序问题』

    更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...

  9. [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)

    [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...

随机推荐

  1. Asp.NetCore Web开发之路由

    接着讲asp.net core web开发,这节讲路由系统(Route). 在asp.net core中通过路由来将请求映射到对应的action,主要用到两个中间件,UseRouting()和UseE ...

  2. Elasticsearch入门,看这一篇就够了

    目录 前言 可视化工具 kibana kibana 的安装 kibana 配置 kibana 的启动 Elasticsearch 入门操作 操作 index 创建 index 索引别名有什么用 删除索 ...

  3. JWT 基本使用

    JWT 基本使用 在上一节中 session 共享功能使用 redis 进行存储,用户量激增时会导致 redis 崩溃,而 JWT 不依赖服务器,能够避免这个问题. 1.传统 session 1.1. ...

  4. Java初始化数据域的途径

    Java调用构造器的具体处理步骤: 1.所有数据域被初始化为默认值(0,false或null); 2.按照在类声明中出现的次序,依次执行所有域的初始化语句和初始化块: 3.如果构造器第一行调用了第二个 ...

  5. “深度评测官”——记2020BUAA软工软件案例分析作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发 ...

  6. 痞子衡嵌入式:MCUBootUtility v3.3发布,可配合SBL项目使用

    -- 痞子衡维护的NXP-MCUBootUtility工具距离上一个大版本(v3.0.0)发布过去4个多月了,期间痞子衡其实断断续续做个几个小版本更新,这一次痞子衡为大家带来了稳定版本v3.3.0,顺 ...

  7. 【转载】深入理解OpenStack-手动制作qcow2镜像

    深入理解OpenStack-手动制作qcow2镜像 2018-01-18 手动制作镜像 1 官方虽提供qcow2系统镜像,但对于有需求的企业来说,还是定制镜像比较靠谱,下面就手动定制一个镜像 给虚拟机 ...

  8. 还可以使用 -c 参数来显示全部内容,并标出不同之处 diff -c test2.txt test1.txt

    二.实例 在test目录下存放了两个文本文件,test1.txt  test2.txt . 比较这两个文件的异同. diff  test1.txt   test2.txt     "5c5& ...

  9. Linux创建RAID1_实战

    Linux创建RAID1实战 Linux创建RAID1 RAID1俗称镜像,它最少由两个硬盘组成,且两个硬盘上存储的数据均相同,以实现数据冗余 RAID1读操作速度有所提高,写操作理论上与单硬盘速度一 ...

  10. Samba服务配置及配置文件说明

    前言 1.配置Samba服务为什么要关闭防火墙(firewalld)和Selinux? 在linux操作系统中默认开启了防火墙,Selinux也处于启动状态,一般状态为enforing:所以,在我们搭 ...