4月题目汇总1(4.16---4.22)


4.17 晚

No.1 来源: BZOJ 2811: [Apio2012] Guard

分类贪心 区间问题
简要题解
1: 去掉没有忍者的区间
2:离散化剩下的点和剩下的区间(只离散化点就可以了)
3: 区间之间有包含关系的 ,去掉大区间,只考虑小区间。具体实现用一个队列就好。
4: 贪心原则:从左到右没有忍者的区间在右端点放一个
5:在这种原则下 令
F(i) 表示前 i 个区间的最少要放的忍者数
G(i)表示第 i n 个区间的最少要放的忍者数
依次考虑每个区间,如果它的右端点 x 放了一个忍者(即F[i]=F[i1]+1) ,考虑能否在 x1 放:
二分求出包含 x1 的第 y1 y2 个区间
F[y11]+G[y2+1]+1>K x 一定要放忍者
反思
1:回去再看一看紫皮书上的区间贪心问题
2: 注意离散化的方法!
3:如何按照需要淘汰区间


  4.18晚

No.2 来源: BZOJ 2125

分类仙人掌图
简要题解
1:把树上倍增的方法延展到仙人掌图上
2: SPFA求出 1 到 其他点的距离 d(i)
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一样直接用之前的子树和当前子树更新答案和f(x)
2. 对于环,令 dfn 最小的为环的根,记为 R ,环的信息集中到跟上,便于上一层的dp
3. 找环的方法: 如果

vson(x),fa(v)x,dfn(v)>dfn(x)
说明 xv
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
设加入 vu 这条边之后 [fv] 变成了 [Fv] 可以得到转移方程如下: [Fv =]
[

f(x)+w(x<=L)x+L+w+c(L<x<L+w)c(L+w<=x<=R+w)xRw+c(x>R+w)
]
把所有这样的 [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. 令 f(x,0),f(x,1) 分别表示以x为根的子树中不选x和选x的最大独立集合,那么

f(x,0)=vson(x)max(f(v,0),f(v,1))f(x,1)=vson(x)f(v,0)

遇到环之后单独拿出来DP,方程差不多,分两情况更新环根的f值就可以了。
套路和 BZOJ 1023 是一样的。
反思
1.桥边和环分开考虑,环的信息集中到环根。
2.根本思路还是基树形dp。


4.19晚

No.6 来源: BZOJ 2811: [Apio2012] Guard

分类树形dp
简要题解
1.一定存在一个点 x ,使得当以x 为根时所有蓝线都形成 fa(i),i,son(i) 的形式。定义这种情形下 i 为这组蓝线的中点。
2.如果确定一个点为根,那就是很简单的树dp,
f(x0)f(0,1) 分别表示当 x 是(或不是)一组蓝线 的中点时,以 x 为根的子树中的蓝线的最大权值和。 那么:

g(x)=max(f(x,0),f(x,1)+w(fa(x),x))f(x,0)=vson(x)g(v)f(x,1)=f(x,0)+maxvson(x){f(v,0)+w(x,v)g(v)}

3.考虑换根,从上至下DFS一遍
设原来 y x的儿子,现在把y当成根
现在 y 不是x的儿子,就要从 x 中去除y的贡献,所以除了记录最大 g(v) ,还要记录次大,因为当 y 正好为x儿子中的最大时, x 此时只能由次大来转移。
反思
1:无根树形dp的换根应该都可以这样处理。
2: 最开始没有注意到点只能一个一个加入,所以找错了规律。


4.20上午

No.7 来源: BZOJ 3205 [Apio2013]机器人

分类dp 斯坦纳树
简要题解
1.考虑dp,f(l,r,i,j) 表示合并了 [l,r] 这些机器人,并且停在 (i,j) 这个格子上的最 小操作数 ,那么 ans=min(f(1,n,i,j))
2.一共有两种转移:
(1) 合并: f(l,r,i,j)min(f(l,mid,i,j)+f(mid+1,r,i,j))|lmid<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: 考虑暴力,设询问的是 uv,A,B ,那就把 aA,bB 的边加入并查集,维护 maxa,maxb ,如果 u,v 联通,并且 maxa=A,maxb=B ,就存在这样一条路径。
2. 分块优化,先把所有边按照 a 排序,所有询问按照b排序。
把边按照 a ,分块 逐块讨论,讨论第x 块的时候,处理 a 在这一块中的询问。
那么之前块中的边的a 一定满足要求。 把 1x1 块中的边,按照 b 排序, 处理询问的时候逐个加入并查集。
3. 对于x 这一块中的边,处理每个询问时加入并查集,询问完暴力恢复即可。
4. 可持久化并查集当然可以,其实只用记录变更的值,暴力改回去就可以。但正因为这样,就不能路径压缩了,只能启发式合并。
反思
1:常用数据结构不能硬上,好像分块的题目都有这种特点。
2: 这个题的关键在于找到一种讨论顺序,这正是分块和莫队的经典运用。


4.20上午

No.9 来源:BZOJ 4539 [Hnoi2016]树

分类树 主席树 倍增LCA
简要题解
1.把每次加的子树看成一个大点,构成一棵大树。这棵大树的边权是 每个点代表的小树根在原来树上的距离。 x 号大点表示的小树根记为root[x]
2.那么总的第 x 个节点对应的大树和原树上的标号(分别记为bid(x),id(x))怎么求?
3.令 size[i] 表示大树上前 i 个大点代表的小节点总数,在size上二分查找 x 可以找到bid(x)
4.令 k=xsize[bid(x)1] ,按照题意, id(x) 也就是要求原树中 root[bid(x)] 这课子树中编号第 k 大的。在DFS序上就变成了区间第k大,主席树轻松搞定。
5.对于询问 uv 求出 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 的余数,特别的,令suffix[i]=num[i,n]
2. 题目中要求的就是给定 L,R 求满足 num[x,y]=0,Lx<yR (x,y) 有多少对。
3. 简单推导一秒

suffix[x]suffix[y+1]+num[x,y] (mod p)

其中 num[x,y]0(mod p) ,所以
suffix[x]suffix[y+1]  (mod p)

也就是求 [L,R+1] 这个区间内 suffix 值相等的数对,离散化之后直接莫队就行了。
反思
1:经典的莫队、分块模型要熟悉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值