组合数学真是太棒了

$CDQ$真是太棒了(雾


参考资料:

1.《组合数学》

2.论文 课件 很容易查到

3.sro __stdcall


偏序关系

关系:

集合$X$上的关系是$X$与$X$的笛卡尔积$X \times X$的子集$R$
即$X$的元素的有序对集合的一个子集
属于$X \times X$的有序对$(a,b)$记为$aRb$

$R$的一些概念:
自反$: \ \forall x \in X,\ xRx$
对称$: \ \forall x,y \in X,\ xRy \rightarrow yRx$
传递$: \ \forall x,y,z \in X,\ xRy,yRz \rightarrow xRz$

偏序$Partial order$:

偏序关系:自反,反对称且传递,符号$<$

严格偏序:反自反,反对称且传递,符号$\le$,如$LIS$

偏序集:$(X,\le )$  如:集合包含,整除

可比$:\ \forall x,y \in X,\ xRy \lor yRx=true$

全序$:\ $每一对元素都可比

$chain:\ X$的一个子集,每一对元素都可比

反链$antichain:\ X$的一个子集,任意两个元素都不可比

极小元和极大元:不存在更小/更大的元素

偏序集的极小元集合和极大元集合都是反链

链与反链有对偶性;$A \bigcap C \le 1$

$Dilworth$定理:

$1.\ $最少反链个数等于最长链大小

$2.\ $最少链个数等于最长反链大小

证明:
只证明$1$ , $2$太长了不(我)想(没)写(看)

设最长链长度$r$

首先反链个数不可能更少是显然的,因为最长链里每一个元素必须在不同的反链里;

现在证明可以划分成$r$个反链,通过不停的在$X$中删除最小元集合,后删除的集合中的每个元素一定比先删除的集合中的某个元素大,这样形成一条链。设一共删除$p$次,容易得到$ p \le r \land p \ge r $, 因此 $ p=r $


$CDQ$分治

注:以下主要为个人理解

我们暂且定义偏序中几个比较关系就是几维,如$LIS$是二维偏序

$CDQ$分治可以解决一类偏序问题,将多维的偏序问题减维

减维的原理

通过规定用$[L,MID]$更新$[MID+1,R]$,使得在满足上一维顺序的同时可以对这一维进行排序来满足这一维的顺序

其他的减维手段还有排序数据结构维护

二维偏序

通常用排序和数据结构维护就可以解决,如$LIS$,用$CDQ$分治强行做复杂度反而多一个$log$

但也有适合$CDQ$分治的,如逆序对。归并排序是$CDQ$的基础和最简单形式

三维偏序

可以用树套树或者$CDQ$分治$+$树,(然而$Candy?$蒟蒻并不擅长写树套树只会$CDQ$)

套路做法是第一维排序对其分治,第二维$CDQ$分治里排序,第三维用数据结构维护(常用树状数组)

因为前两维已经满足了,数据结构只维护一维就很简单了,常见区间和、区间最大值

常见形式:

目前遇到的三维偏序问题有两种形式

$1.$更新时不需要完整信息,可以把左更新右放到最后,如统计类问题

这类问题的排序可以使用归并排序,或者提前排序然后在分治里把序列分成两份(这时候递归调用写在最后)

$CDQ(l,r)$

$\ CDQ(l,mid)\ CDQ(mid+1,r)$

$\ [l,mid] \rightarrow [mid+1,r]$

$2.$更新时需要完整信息,用左更新右后才可以递归右面,如最优化问题

这类问题通常需要在分治里单独排序

$CDQ(l,r)$

$\ CDQ(l,mid)\ sort(l,r)$

$\ [l,mid] \rightarrow [mid+1,r]$

$\ CDQ(mid+1,r)$

复杂度分析

根据主定理:

$T(n)=2T(\frac{n}{2})+O(kn)=O(knlogn)$

根据算法导论上的练习题

$T(n)=2T(\frac{n}{2})+O(knlogn)=O(knlog^2n)$

常见用途:

$1.$数据结构题

在这类问题中通常将时间(操作序列)作为第一维,剩下的二维问题使用$CDQ$分治和数据结构

如$Mokia$,动态逆序对,天使玩偶

对应上文的第一种形式

注意必须要“修改独立”才行

如果强制在线我就只有等死了

$2.\ DP$ 

$(1)$三维$LIS$

将序列编号作为第一维,分治里需要单独排序,感觉使用间接排序比较好

如$SDOI2011$拦截导弹

$(2)$斜率优化$DP$维护凸包

感觉比用平衡树好多了($Candy?$蒟蒻并没有写过用平衡树维护)

如:$cash$,$WF2011\ Machine\ Works$

序列编号作为第一维,然后使用一种“先按斜率排序,分治时按序列编号(时间)分成两块再递归”的技巧

递归完$[l,mid]$后需要按$x$排好序,然后维护一个凸包

因为这时$[mid+1,r]$是斜率排好序的,在凸包上扫描一遍就可以了

为了避免精度问题可以使用叉积与点斜式

四维偏序

$CDQ$分治套$CDQ$分治

设四维$a,b,c,d$

$Sort\ at\ a$

$CDQ(l,r)$

$\quad CDQ(l,mid)$

$\quad CDQ(mid+1,r)$

$\quad MergeSort\ at\ b$ 每个元素标记属于$[l,mid]$还是 $[mid+1,r]$

$\quad CDQ2(l,r)$

$CDQ2(l,r)$要做的和普通的三维偏序一样,就是多了一个标记的限制(来自$CDQ$中$a$的限制,必须用标记不能判断$a \le mid$,因为$CDQ2$是要递归下去的,$mid$就变了)

总结一下就是有一个序$b$和限制$a$,然后处理$c,d$的二维问题

复杂度$O(nlog^3n)$ ,每多套一个$CDQ$分治就多一个$log$

100维偏序

$O(100*N^2)$暴力就好了.....


总结:

$CDQ$分治结束啦~\(≧▽≦)/~

虽然课件上还有一些题下个月再做吧

明天看一下整体二分然后就开始仔细研究组合数学了

[偏序关系与CDQ分治]【学习笔记】的更多相关文章

  1. 初学cdq分治学习笔记(可能有第二次的学习笔记)

    前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...

  2. CDQ分治学习笔记

    数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...

  3. [摸鱼]cdq分治 && 学习笔记

    待我玩会游戏整理下思绪(分明是想摸鱼 cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法 对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态 ...

  4. CDQ分治学习笔记(三维偏序题解)

    首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ ...

  5. 三维偏序[cdq分治学习笔记]

    三维偏序 就是让第一维有序 然后归并+树状数组求两维 cdq+cdq不会 告辞 #include <bits/stdc++.h> // #define int long long #def ...

  6. CDQ分治学习思考

    先挂上个大佬讲解,sunyutian1998学长给我推荐的mlystdcall大佬的[教程]简易CDQ分治教程&学习笔记 还有个B站小姐姐讲解的概念https://www.bilibili.c ...

  7. cdq分治学习

    看了stdcall大佬的博客 传送门: http://www.cnblogs.com/mlystdcall/p/6219421.html 感觉cdq分治似乎很多时候都要用到归并的思想

  8. [Updating]点分治学习笔记

    Upd \(2020/2/15\),又补了一题 LuoguP2664 树上游戏 \(2020/2/14\),补了一道例题 LuoguP3085 [USACO13OPEN]阴和阳Yin and Yang ...

  9. 点分治&&动态点分治学习笔记

    突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...

随机推荐

  1. 如何在vue中使用sass

    使用sass,我们需要安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --sav ...

  2. Java的语言特点详解

    1)简单性:java从C++简化而来,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.java还剔除了C++操作符过载和指针操作. 2)面向对象:java是一个面向对象的语 ...

  3. 使用C#的AssemblyResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  4. 《你不知道的JavaScript上卷》知识点笔记

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...

  5. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  6. gettype

    取得变量的类型. 语法: string gettype(mixed var); 返回值: 字符串 函数种类: PHP 系统功能 内容说明 本函数用来取得变量的类型.返回的类型字符串可能为下列字符串其中 ...

  7. HTML <form>标签

    1.单选按钮 <html> <body> <form> 名: <input type="radio" name="myname& ...

  8. C#读取固定文本格式的txt文件

    C#读取固定文本格式的txt文件 一个简单的C#读取txt文档的程序,文档中用固定的格式存放着实例数据. //判断关键字在文档中是否存在 ] == "设备ID:107157061" ...

  9. LED服务总结

    简单的程序总结 一个简单的用于控制LED屏幕的小程序,用到的一个常识 LED服务开发总结 系统运行截图   系统功能说明: 1.ServerStrack服务,提供前台访问. 2.动态库调用,用于信息转 ...

  10. Hyperledger Fabric Transaction Flow——事务处理流程

    Transaction Flow 本文概述了在标准资产交换过程中发生的事务机制.这个场景包括两个客户,A和B,他们在购买和销售萝卜(产品).他们每个人在网络上都有一个peer,通过这个网络,他们发送自 ...