信息竞赛:分治
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题迎刃而解。
Stage I Type B 一维区间 Antimatter
给出n个正整数,你可以在一些数之前添上负号。 一个合法的区间被定义为区间中数的和为0。
问有多少种不同的合法区间。
合法区间不同当且仅当区间不同或者区间中的数不同。 n<=1000,所有数的和<=10000
考虑暴力扫一半,维护另一半
问题便迎刃而解。
Stage I Type B 一维区间 Yura and Developers
如果改成有m个询问,每次询问区间[l,r]是否能在去掉最大值的情况下被k 整除。
可以继续分治。
为何不直接线段树? 说明线段树和分治本质上非常相似。
Stage I Type B 一维区间 Can’t Stop
由于是最近,我们甚至不需要考虑相同子树的情况。
那么根据对称性便有两种情况。
最大最小同时在左侧 最小在左侧,最大在右侧 分别讨论即可。
Stage I
把题目总结起来你就会发现特点十分明显。 答案和点对有关
答案和区间有关
辅助思考的便是比如知道中间一个点对解题有什么帮助。 挺中规中矩的。
Stage II 二维情况 Parking Lot
Codeforces Round #225 D
Stage I Type B 一维区间 Antimatter
考虑分治,我们可以从mid开始分别往左右作dp。 再花O(m)的时间合并即可得到穿过mid的所有区间的答案。
其实可以直接做背包。
Stage I Type B 一维区间 Yura and Developers
f(1,i,ai)&f( j,n,aj)均可预处理。 那么问题变成了求逆序对。
Stage I Type A 一维点对 友好点
平面上有n个不同的点。 如果一个矩形只包含(包括边界)这两个点,则称其为友好点。
求有多少对友好点。
n<=10^5
经典问题
Stage I Type A 一维点对 友好点
这样就要支持在每个重心插入一个点。原本可以用单调队列解决的问题需 要用平衡树维护。 问题便迎刃而解。
Stage III Type B 树上点对 Hide 捉迷藏
给出一棵n个节点的树。 有两种操作,共q个
1.改变一个节点的颜色(黑、白)。
2.询问最远两个黑点的距离。
n<=10^5,q<=5*10^5
再考虑经过中线的所有区间。
如果没有修改,我们算出中线上的“柱状图”,再用单调队列维护就行。 有修改,当前矩阵中有k个修改,我们就重新维护k次。
这样每个修改对复杂度的贡献其实是nlogn的。
Stage II 二维情况 Empty Rectangles
给出一个n*m的01网格。 求有多少矩形中恰好包含k个1.
给出一棵带权树。 求长度在[L,R]之间的所有路径中,最大权值平均值。
n<=10^5
WC 2010
Stage III Type A 树上路径 重建计划
答案是平均值,那么我们二分之后变成求最大值是否大于0. 接着就是树分治。
考虑怎么保证长度在[L,R]之间。
其实还是可以单调队列。控制加入的时间就行了。 问题便迎刃而解。。。
有两个长度为n的01串ab。 对于某个i,如果存在x,y满足a[x]=b[y]=1且x or y=i,那么c[i]=1。
求c。
n<=2*10^5
训练赛
Stage I Type A 一维点对 Or
不妨令d[i]=∑(a[x]*b[y]) (x or y=i),那么c[i]=(d[i]>0),定义d=a*b 将a分成首位为0和为1的两部分,b同理。即a=AB, b=CD
Stage II
二维上也能这么玩分治的。 二维对矩形的查询。
特征再简单不过。
有意思的是一般这种情况下都不会有修改出现,但第一道题就出现了修改。 不过修改次数实在太少了 虽然特点明显,还是需要灵活变通
Stage III Type A 树上路径 树
给出一个n个点的树。 每条边有边长以及收益。
考虑将点按横坐标排序之后分治。 由于对称性,不妨单独考虑左下角在左侧,右上角在右侧的情况。
考虑固定左侧的某个点,那么右侧能选择的点则是一个上升序列,区间由 左侧的点决定。
分别对左右的点维护单调栈即可解决问题。
Stage I Type A 一维点对 Tricky Function
给出一个长度为n的序列a。 令f(i,j)=(i-j)^2+g(i,j)^2.
给出长度为n的序列,每个位置上有d个数。 你需要选出k个数。
如果一个区间内每个位置上的d个数至少有一个出现在选出的k个数中,则 是一个合法的区间。
最大化最长的合法区间的长度。
n<=10^5,d<=4,k<=3
GCJ World Final 2013 D
Stage I Type B 一维区间 Can’t Stop
分治
YALI - LYY
本质
缩小问题规模
总览
Part I.中规中矩的分治 Part II.有特殊作用的分治
Part III.基于答案的分治
Part I.中规中矩的分治
一维情况
答案和点对有关
答案和区间有关
二维情况 树分治
答案和路径有关
答案和点对有关
Stage I Type A 一维点对 Pashmak and Parmida's problem
Stage III Type B 树上点对 War
给出一个n个节点的带权树。 有m个询问,每次询问点x距离编号为l..r的点中距离最近的点的距离。
n,m<=2*10^5
训练赛
Stage III Type B 树上点对 War
考虑和上题一样,树分治之后维护分治结构。 在每个重心处弄一个维护顶点编号的线段树就能解决问题。
又g(i,j)=∑ak (min(i,j)+1<=k<=max(i,j))
求f最小的函数值。 n<=10^5
Codeforces Round #245 D
Stage I Type A 一维点对 Tricky Function
g(i,j)=sum[i]-sum[ j] 问题转换为给出二维平面上n个点,分别为(i,sum[i]),求最近点对。
考虑暴力,枚举左端点,在右端点的d个数中选一个未出现过的,继续向右 拓展。
考虑分治,我们每次从中点开始使用同样的暴力,只是在不能拓展的时候 左右端点同时枚举,就能计算所有跨过mid的答案。
采用BFS顺序分治能将复杂度降至一个O(n)。
Stage I Type B 一维区间 Pudding Monsters
给出一个排列p。 问p有多少区间满足给整个区间减去某个数之后能得到一个排列。
n<=3*10^5
ZeptoLage I Type B 一维区间 Pudding Monsters
考虑直接分治并处理所有跨过中点的区间。 对于一个区间,我们关心的是L,R和其中的最大最小值。
给出一个长度为n的序列a。 询问有多少对长度大于1的区间满足
在去掉最大值后剩下的数之和仍能被k整除。
n<=3*10^5,k<=10^6
Codeforces Looksery Cup 2015 F
Stage I Type B 一维区间 Yura and Developers
考虑每次先处理穿过[L,R]的最大值的区间再处理左右两边。 这样可能退化到n^2
给出长度为n的序列a。 f(i,j,x)表示ai..aj中x的出现次数。
求有多少对i,j满足f(1,i,ai) > f( j,n,aj)。(i<j)
n<=10^6
Codeforces Round #261 D
Stage I Type A 一维点对 Pashmak and Parmida's problem
经典分治问题。
分别找出左右两边的最近距离,再更新答案。
Stage I Type A 一维点对 最小三角形
给出平面上n个点。 求周长最小的三角形。
n<=2*10^5
Stage I Type A 一维点对 最小三角形
和最近点对类似的分治
Stage I Type A 一维点对 Or
我们可以按照重心的儿子的顺序,每次先将一个儿子子树中所有的点进行 询问,再将这些点插入进Trie树。
再来考虑至少经过k个喜欢的点。
我们只需在Trie树中记录子树最大深度(原树的深度),就能在查询的时候 判断了。
Stage III Type B 树上点对 紫荆花之恋
给出一个初始只有1个点的带权树。 每个点有个范围Ri,如果两个点满足Dis(i,j)<=Ri+Rj,则他们是朋友。
ZJOI 2007
Stage III Type B 树上点对 Hide 捉迷藏
如果没有修改我们可能更倾向于利用dp解决问题。但dp无法维护。 考虑这其实是求所有黑色点对距离最大值,考虑使用树分治。
有修改,不妨像上题 一样维护分治结构。
那么每次修改只需对所属的logn个分治结构进行修改。 在每个重心处维护一个堆就行了。
n,m<=2500,k<=6
Codeforces Round #213 E
Stage II 二维情况 Empty Rectangles
像上题一样分治 考虑在中线上固定上端点,枚举下端点,在向两边扩展。
显然我们只care扩展到什么时候有了i个1,然后就能算出答案。
可以发现随着右端点移动,扩展到i个1的长度只会递减。 有了这个单调性就能计算答案了。
给出一个n*m的网格图。 有的位置上有障碍物。
给出k个操作,每次将一个格子变为障碍物,再询问没有障碍物的最大子正 方形。
n,m,k<=2000
Codeforces Round #274 E
Stage II 二维情况 Parking Lot
考虑对于一个n*m的矩阵,我们按n,m中较大的一维将矩阵分为相等的两 部分
找出长度不超过K的简单路径中收益和最大的。
n<=10^5
训练赛
Stage III Type A 树上路径 树
直接上树分治。 直接统计出所有点到重心的长度和收益,按长度排序之后twopoints扫扫 就行。 相同子树的问题就记个次大值就行了。
Stage III Type A 树上路径 重建计划
Stage III Type A 树上路径 树(王康宁)
给出一个n个点的树,点上有权值。 有一些你喜欢的点。
选出一条路径上点权异或最大的路径,并且至少经过k个你喜欢的点。
n<=10^5
2013中国国家集训队第二次作业
Stage III Type A 树上路径 树(王康宁)
考虑异或最大,我们建立Trie树即可支持查询。 观察题目后我们发现仍然需要判断两条路径是否属于同一子树。
每次可以添加1个叶节点,并询问此时树中有多少朋友。
n<=10^5 强制在线。
WC 2014
Stage III Type B 树上点对 紫荆花之恋
先考虑没有加入,直接给出树询问答案。 很明显的树上点对问题。
如果有插入,考虑运用替罪羊树思想。不妨将树分治的分治结构看做一棵 树,那么如果某个节点的最大子树大小超过当前子树大小*c,就暴力重建 整个结构。
令ci=∑aj*b[cnt(i^j)],其中cnt(x)表示x二进制中1的个数。
求c 。 n<=10^5
训练赛
Stage I Type A 一维点对 Xor
不妨考虑按二进制位分治。 当前分治区间为[L,R],深度为dep,其中[L,mid]第dep位均为0, [mid+1,R]的第dep位均为1. 令f[i][ j]表示在当前分治区间内,与 i 有 j 位二进制不同的数之和。 很容易由[L,mid],[mid+1,R]得到[L,R]的f值。
同理考虑d,d的前半部分实际上等于A*C,后半部分等于A*D+B*C+B*D
不难证明我们定义的*满足分配率,因此d=[A*C][(A+C)*(B+D)-A*C] 那么我们递归计算A*C&(A+C)*(B+D)即可。
Stage I Type A 一维点对 Xor
给出长度为n=2^k的序列a。 给出长度为k的序列b。