您的位置:首页 > 其它

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

2017-04-17 22:09 162 查看
4.17 晚


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

分类:贪心 区间问题

简要题解:

1: 去掉没有忍者的区间

2:离散化剩下的点和剩下的区间(只离散化点就可以了)

3: 区间之间有包含关系的 ,去掉大区间,只考虑小区间。具体实现用一个队列就好。

4: 贪心原则:从左到右没有忍者的区间在右端点放一个

5:在这种原则下 令

F(i)表示前i个区间的最少要放的忍者数

G(i)表示第i n个区间的最少要放的忍者数

依次考虑每个区间,如果它的右端点x放了一个忍者(即F[i]=F[i−1]+1) ,考虑能否在x−1放:

二分求出包含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 到 其他点的距离 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. 找环的方法: 如果v∈son(x),fa(v)≠x,dfn(v)>dfn(x)说明 x→v形成了一个环

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 =]

[f(x)+w(x<=L)−x+L+w+c(L<x<L+w)c(L+w<=x<=R+w)x−R−w+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)=∑v∈son(x)max(f(v,0),f(v,1))f(x,1)=∑v∈son(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(x,0),f(0,1) 分别表示当x 是(或不是)一组蓝线 的中点时,以 x 为根的子树中的蓝线的最大权值和。 那么:令:g(x)=max(f(x,0),f(x,1)+w(fa(x),x))f(x,0)=∑v∈son(x)g(v)f(x,1)=f(x,0)+maxv∈son(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))|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 排序,所有询问按照b排序。

把边按照a ,分块 逐块讨论,讨论第x 块的时候,处理a 在这一块中的询问。

那么之前块中的边的a 一定满足要求。 把1⇝x−1块中的边,按照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=x−size[bid(x)−1],按照题意,id(x)也就是要求原树中root[bid(x)] 这课子树中编号第k 大的。在DFS序上就变成了区间第k大,主席树轻松搞定。

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 的余数,特别的,令suffix[i]=num[i,n]。

2. 题目中要求的就是给定L,R 求满足 num[x,y]=0,L≤x<y≤R 的(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:经典的莫队、分块模型要熟悉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: