4.17 晚
No.1 来源: BZOJ 2811: [Apio2012] Guard
分类:贪心 区间问题
简要题解:
1: 去掉没有忍者的区间
2:离散化剩下的点和剩下的区间(只离散化点就可以了)
3: 区间之间有包含关系的 ,去掉大区间,只考虑小区间。具体实现用一个队列就好。
4: 贪心原则:从左到右没有忍者的区间在右端点放一个
5:在这种原则下 令
F(i)
表示前
i
个区间的最少要放的忍者数
依次考虑每个区间,如果它的右端点
x
放了一个忍者(即
二分求出包含
x−1
的第
y1
到
y2
个区间
若
F[y1−1]+G[y2+1]+1>K
则
x
一定要放忍者
反思:
1:回去再看一看紫皮书上的区间贪心问题
2: 注意离散化的方法!
3:如何按照需要淘汰区间
4.18晚
No.2 来源: BZOJ 2125
分类:仙人掌图
简要题解:
1:把树上倍增的方法延展到仙人掌图上
2: SPFA求出 1 到 其他点的距离
3:Tarjan找出所有环,统计这个环的总长
totdist
,和环上按照某一方向的距离前缀和
sum(i)
。
4:对于一个环,把dfn最小的当根,其他点连在它上面
5:考虑
x,y
两点之间的距离,令,
t1,t2,
分别为
lca(x,y)→x
,
lca(x,y)→y
路径上的第一个点
如果
t1,t2
在同一个环内
ans=d[x]+d[y]−d[t1]−d[t2]+len
len
表示环上
t1−>t2
的最短路,有两个方向,也就是:
len=min(|sum(t1)−sum(t2)|,totdist−|sum(t1)−sum(t2))|)
反思:
1.仙人掌图的问题多借鉴一下树上问题的解决方法
2。tarjan不要写错
4.19 上午
No.3 来源: BZOJ 1023
分类:仙人掌图
简要题解:
令
f(i)
表示i号点与其子树中的点最远的距离,设当前讨论的点为
x
1. 对于桥边,可以像普通的dp一样直接用之前的子树和当前子树更新答案和
2. 对于环,令
dfn
最小的为环的根,记为
R
,环的信息集中到跟上,便于上一层的dp
3. 找环的方法: 如果
4. 把环单独拿出来DP,可以单调队列优化,最后扫一遍环上的点,更新 f(R)
反思:
1.仙人掌图要多考虑环的处理方式,对各种找环的方式要熟悉。
2.单调队列居然有点忘了
4.19 下午
No.4 来源: BZOJ 4585
分类:树dp 凸包 可并堆
简要题解:
令
[fi(x)]
表示i号节点为根的子树中将叶子节点距离调整为x的最小代价。
不难现是一个形如下图下凸函数
并且在[L,R] 取到最小值。
令
v∈ son(v)
,考虑
[fv]
对
[fu]
的贡献 令
[fv(L)]=[fv(R)]=c
设加入
v→u
这条边之后
[fv]
变成了
[Fv]
可以得到转移方程如下:
[Fv =]
[
把所有这样的 [Fv] 合并起来可以得到 [fu]
怎么保存这样的凸包信息? splay+启发式合并当然理论可行,但肯定是失了智。
考虑 [Fv] 和 [fv] 这两种凸包的特点
[Fv] 由 [fv] 平移得到第一段,后三段斜率分别是 −1,0,1
归纳可知, [fv] 的斜率变化只能是 −1 或者 +1
从而 [fv] 最右端的斜率一定是 degree(v)
把凸包放到按照横坐标排序的大根堆里,pop掉 degree(v)−1 个点,就得到了上图中的 L,R 两个点。
[f1(0)] 显然等于边权之和,一直减到 L 这个点的函数值就是答案了。
反思:
1.好神奇的题,没什么好说的。
4.19下午
No.5 来源: BZOJ 4316 小C的独立集
分类:仙人掌图
简要题解:
1. 令
遇到环之后单独拿出来DP,方程差不多,分两情况更新环根的f值就可以了。
套路和 BZOJ 1023 是一样的。
反思:
1.桥边和环分开考虑,环的信息集中到环根。
2.根本思路还是基树形dp。
4.19晚
No.6 来源: BZOJ 2811: [Apio2012] Guard
分类:树形dp
简要题解:
1.一定存在一个点
x
,使得当以
2.如果确定一个点为根,那就是很简单的树dp,
令
3.考虑换根,从上至下DFS一遍
设原来 y 是
现在 y 不是
反思:
1:无根树形dp的换根应该都可以这样处理。
2: 最开始没有注意到点只能一个一个加入,所以找错了规律。
4.20上午
No.7 来源: BZOJ 3205 [Apio2013]机器人
分类:dp 斯坦纳树
简要题解:
1.考虑dp,
2.一共有两种转移:
(1) 合并:
f(l,r,i,j)←min(f(l,mid,i,j)+f(mid+1,r,i,j))|l≤mid<r
(2)同层转移 :
f(l,r,i,j)←min(f(l,r,x,y)+1)|(x,y)
能一步到达
(i,j)
3.显然算法的瓶颈在第二种转移以上,这种同层转移的本质和斯坦纳树是一样的,可以用spfa。
4. 用记忆化搜索可以预处理出从每个点出发朝某个方向最终停在哪里。
5.由于spfa的玄学复杂度,要加上一个特别的优化。
反思:
1:这种同层转移特点的dp都可以用spfa的思想。
2: 预处理的时候要考虑循环的情况。
4.20上午
No.8 来源: [Hnoi2016 day1]最小公倍数
分类:并查集 分块
简要题解:
1: 考虑暴力,设询问的是
u→v,A,B
,那就把
a≤A,b≤B
的边加入并查集,维护
maxa,maxb
,如果
u,v
联通,并且
maxa=A,maxb=B
,就存在这样一条路径。
2. 分块优化,先把所有边按照
a
排序,所有询问按照
把边按照
a
,分块 逐块讨论,讨论第
那么之前块中的边的
3. 对于
4. 可持久化并查集当然可以,其实只用记录变更的值,暴力改回去就可以。但正因为这样,就不能路径压缩了,只能启发式合并。
反思:
1:常用数据结构不能硬上,好像分块的题目都有这种特点。
2: 这个题的关键在于找到一种讨论顺序,这正是分块和莫队的经典运用。
4.20上午
No.9 来源:BZOJ 4539 [Hnoi2016]树
分类:树 主席树 倍增LCA
简要题解:
1.把每次加的子树看成一个大点,构成一棵大树。这棵大树的边权是 每个点代表的小树根在原来树上的距离。
x
号大点表示的小树根记为
2.那么总的第
x
个节点对应的大树和原树上的标号(分别记为
3.令
size[i]
表示大树上前
i
个大点代表的小节点总数,在
4.令
k=x−size[bid(x)−1]
,按照题意,
id(x)
也就是要求原树中
root[bid(x)]
这课子树中编号第
k
大的。在DFS序上就变成了区间第
5.对于询问
u→v
求出
bid(u),bid(v)
在大树上的距离 ,特殊讨论一下
lca(bid(u),bid(v))这个大点里面的情况就可以。
反思:
1:long long !long long !long long ! 重要的事情说三遍。
2: 这种树上的问题,不要怕麻烦,每种情况画图想清楚,除了样例之外,一定要自己造一些小数据手动排错。
4.20下午
No.10 来源:BZOJ4540 [Hnoi2016]序列
分类:数论 莫队
简要题解:
1. 记
num[l,r]
表示这一段组成的数对
p
的余数,特别的,令
2. 题目中要求的就是给定
L,R
求满足
num[x,y]=0,L≤x<y≤R
的
(x,y)
有多少对。
3. 简单推导一秒
其中 num[x,y]≡0(mod p) ,所以
也就是求 [L,R+1] 这个区间内 suffix 值相等的数对,离散化之后直接莫队就行了。
反思:
1:经典的莫队、分块模型要熟悉。