5.30晚
NO.1 来源 : BZOJ 2342 [Shoi2011]双倍回文
分类: 回文,Manachar
简要题解:
- 先用Manachar求出 f(i) ,令 p(i) 表示以 i,i+1 中间为对称轴能延伸的最长长度,也就是 s[i−p(i)]=s[i+1+p(i)] ,显然 p(i)=f(i∗2+1)−12
- 枚举中心
x
,如果
x<y≤(x+p(x)2) 并且 y−p(y)≤x 那么一定有一个关于 x,x+1 中间对称的,长度为 (y−x)∗4 的双回文串。 - 对
y
的第二个条件可以用排序+按顺序加入讨论来保证。第一个条件用一个set维护。时间复杂度
O(logn) . - 貌似有大神用的并查集,可是蒟蒻并不会。
反思:
- Manachar 可以很灵活的变形,求出其他和回文串中心有关的长度值。
- 重点关注满足哪些条件就可以更新答案和怎么维护这些条件。
5.31上午
NO.2 来源 : BZOJ 4213 贪吃蛇
分类: 上下界网络流
简要题解:
- 被环状蛇覆盖的格子与两个格子相连,非环状蛇除了头尾只与一个格子相连之外,其他格子也与两个格子相连。
- 对网格进行黑白染色,环状蛇的头和尾一定在不同颜色的格子里。
-
S→每个白点,cap=2,cost=0
(限制流量恰好为2)
每个黑点→T,cap=2,cost=0 (限制流量恰好为2)
白点→相邻的黑点,cap=1,cost=0 - 环状蛇只会转化成上面几种边,所以不会产生任何费用。
特别的, 边上的白点→Tcap=1,cost=1
非环状蛇的头尾都会经过一条上面这种边,所以对答案的贡献是2.
反思:
- 把网格问题转化成网络流问题的常用途径就是染色(标号)法。
- 满足要求的情形有哪些类?一个一个想清楚。
5.31上午
NO.3 来源 4755: [Jsoi2016]扭动的回文串
分类: Manacher,Hash
简要题解:
- 先对两个串跑一遍Manacher,求出 f(i),g(i) ,令 ans=max(f(i)−1,g(i)−1))
- 现在考虑连接而成的串。枚举回文中心,显然先在当前串上扩展到最长 l,r ,再看 l−1,r+1 两个方向最多能扩展多少,这个显然可以二分+Hash判定。时间复杂度 O(nlogn)
反思:
- Manacher要注意原始串和扩展后的串的对应关系,注意会回文区间的开闭。
- 判定子串相等用Hash。
5.31上午
NO.4 来源 BZOJ 3243 [Noi2013]向量内积
分类: 线性代数,随机
简要题解:
- 把输入看成
n∗d
的矩阵
A
,令
B=A∗AT ,那么 Bi,j 表示的就是 vi,vj 的点积。 - 考虑 k=2 的情况,也就是要看有没有 Bi,j=0 ,等价于判断 B 是否等于全1矩阵。判断两个矩阵相等的经典方法是随机枚举向量,分别乘积,检查结果是否相等。
- 对于
k=3 注意到 22≡1 (mod 3) ,考虑点积的平方。(∑i=1dai∗bi )2=(∑i=1dai∗bi )∗(∑j=1daj∗bj )=∑i=1d∑j=1daiajbibj - 重新构造一个 n∗d2 的矩阵 C,Ci,j∗(d−1)+k=Ai,j∗Ai,k ,这就转化为 k=2 的情形了。
反思:
- 向量、矩阵都是线性代数的内容,很多东西是可以相通的。
- 判断两个矩阵相等。
5.31上午
NO.5 来源 不知道是哪里的集训题: 树上计算
分类: 树链剖分,树上乱搞
简要题解:
- 一些约定:
size(x)
表示子树大小,
scnt(x),gcnt(x)
分别表示
x
的儿子、儿子和孙子的数量。
sum(x) 表示 x 子树的权值和。 - 直接维护每个点的答案
f(x) ,对一个点 x 的修改+d ,影响的是他的儿子和孙子,以及他到根的祖先点。
- 对于孙子节点 v,Δf(v)=d∗(size(v)+1)
- 对于儿子节点 v,Δf(v)=d∗(2+size(v)∗scnt(v))
- 对于
x,Δf(x)=d∗(2+size(x)∗gcnt(x)−∑fa(v)=xsize(v)∗scnt(v) )
其中令 g(v)=∑fa(v)=xsize(v)∗scnt(v) 是可以预处理的。
- 对于以上三种,都可以只在修改的时候打标记,询问的时候考虑一下 fa(x),fa(fa(x)) 的影响就可以了。
- 对于
x
的祖先节点
v ,令 y 表示v→x 路径上的第一个点, Δf(v)=d∗(gcnt(x)+1)∗(size(v)−size(y)) 。考虑轻重链剖分,重链上用线段树维护 ∑gcnt(x)+1 ,修改的时候线段树上修改这个点,同时,向上跳轻链的时候修改 f(fa(top[x])) .
反思:
- 注意到影响那些点之后,要考虑哪些是一类的变化,用什么维护。