[ABC228-G] Digits on Grid
可以发现行数和列数相当小,可以将其中一维状压,同时因为奇数步和偶数步的操作很类似,只需要考虑其中一种就行了,这里考虑奇数步。
设
f
(
S
)
f(S)
f(S) 表示当前位置所在的行的集合为
S
S
S 的方案数,接下来我们需要计算出
g
(
S
)
g(S)
g(S) ,其意义是所在的列的集合为
S
S
S 的方案数,这时候我们从
f
(
S
)
f(S)
f(S) 中找一个数字
a
a
a 拓展,其能到达的行的集合为
D
(
S
,
a
)
D(S,a)
D(S,a) ,那么可以得到转移:
g
(
D
(
S
,
a
)
)
←
f
(
S
)
g(D(S,a))\leftarrow f(S)
g(D(S,a))←f(S)
这个 D ( S , a ) D(S,a) D(S,a) 可以使用 D ( S , a ) = { j ∣ i ∈ S , a i , j = a } D(S,a)=\{j\mid i\in S, a_{i,j}=a\} D(S,a)={j∣i∈S,ai,j=a} 得到。
初始条件显然是 f ( { 1 , 2 , 3 , … , h } ) = 1 f(\{1,2,3,\dots, h\}) = 1 f({1,2,3,…,h})=1
[ABC229-G] Longest Y
容易想到二分,然后 check \verb|check| check 的时候显然要选择编号连续的一段,保持中间的不动,然后两头往中间靠就行了。
[ABC230-G] GCD Permutation
可以先写一下题目要求的式子:
A
N
S
=
∑
i
=
1
n
∑
j
=
i
n
[
(
i
,
j
)
>
1
∧
(
p
i
,
p
j
)
>
1
]
\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \left[(i,j)> 1 \land \left(p_i,p_j\right)> 1\right]
ANS=i=1∑nj=i∑n[(i,j)>1∧(pi,pj)>1]
对于形如 [ n > 1 ] [n>1] [n>1] 的判断式,可以使用莫比乌斯函数的性质: ∑ d ∣ n μ ~ ( d ) = [ n > 1 ] \sum_{d|n} \tilde\mu(d)=[n>1] ∑d∣nμ~(d)=[n>1] 展开。注意,这个 μ ~ ( n ) = − μ ( n ) \tilde\mu(n)=-\mu(n) μ~(n)=−μ(n) 。由于原题的条件式是 and \verb|and| and ,因此可以直接将两个求和乘起来。
变化一下:
A
N
S
=
∑
i
=
1
n
∑
j
=
i
n
∑
d
∣
(
i
,
j
)
∑
g
∣
(
p
i
,
p
j
)
μ
~
(
d
)
μ
~
(
g
)
\mathrm{ANS}= \sum_{i=1}^n \sum_{j=i}^n \sum_{d|(i,j)} \sum_{g|\left(p_i,p_j\right)} \tilde\mu(d) \tilde\mu(g)
ANS=i=1∑nj=i∑nd∣(i,j)∑g∣(pi,pj)∑μ~(d)μ~(g)
按照化式子的套路,可以将
d
,
g
d,g
d,g 放到前面去:
A
N
S
=
∑
d
=
1
n
∑
g
=
1
n
μ
~
(
d
)
μ
~
(
g
)
∑
i
=
1
n
∑
j
=
i
n
[
d
∣
i
∧
d
∣
j
∧
g
∣
p
i
∧
g
∣
p
j
]
\mathrm{ANS}= \sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \sum_{i=1}^n \sum_{j=i}^n [d|i~\land~d|j~\land~g|p_i~\land~g|p_j]
ANS=d=1∑ng=1∑nμ~(d)μ~(g)i=1∑nj=i∑n[d∣i ∧ d∣j ∧ g∣pi ∧ g∣pj]
后面两个
Σ
\Sigma
Σ 可以看成是一个关于
d
,
g
d,g
d,g 的函数,但是因为
d
,
g
d,g
d,g 对
i
,
j
i,j
i,j 的限制其实是一样的,因此设
f
(
d
,
g
)
=
∑
i
=
1
n
[
d
∣
i
∧
g
∣
p
i
]
f(d,g)=\sum_{i=1}^n [d|i~\land~g|p_i]
f(d,g)=∑i=1n[d∣i ∧ g∣pi] ,那么式子就变成了:
A
N
S
=
∑
d
=
1
n
∑
g
=
1
n
μ
~
(
d
)
μ
~
(
g
)
f
(
d
,
g
)
[
f
(
d
,
g
)
+
1
]
2
\mathrm{ANS}=\sum_{d=1}^n \sum_{g=1}^n \tilde\mu(d) \tilde\mu(g) \frac{f(d,g)[f(d,g)+1]}{2}
ANS=d=1∑ng=1∑nμ~(d)μ~(g)2f(d,g)[f(d,g)+1]
μ ~ ( n ) ≠ 0 \tilde\mu(n)\ne 0 μ~(n)=0 位置不多,将这些位置都找出来。
[ABC225-F] String Cards
写了一堆假做法。
首先将字符串排序,使其满足对于任意一组
1
≤
i
<
j
≤
N
1\leq i < j\leq N
1≤i<j≤N ,满足
S
i
+
S
j
<
S
j
+
S
i
S_i+S_j< S_j+S_i
Si+Sj<Sj+Si 。然后倒着
d
p
dp
dp ,设
f
(
i
,
j
)
f(i,j)
f(i,j) 表示考虑了第
i
i
i 到
n
n
n 个,选择了
j
j
j 个的最小字符串,显然有转移:
f
(
i
,
j
)
=
min
{
f
(
i
+
1
,
j
)
,
S
i
+
f
(
i
+
1
,
j
−
1
)
}
f(i,j)=\min\{f(i+1,j),S_i + f(i+1,j-1)\}
f(i,j)=min{f(i+1,j),Si+f(i+1,j−1)}
[ABC225-G] X
首先可以转化一下题意: A N S = ( ∑ i , j A i , j ) − 不选择的位置 − C × 横 线 数 \mathrm{ANS}=\left(\sum_{i,j} A_{i,j}\right)-\text{不选择的位置}-C\times 横线数 ANS=(∑i,jAi,j)−不选择的位置−C×横线数 。我们要最小化这两个减去的数,可以考虑用最小割。
有两种选择:
- 不选择这个数。
- 选择这个数,尝试和左上角和右上角连接起来,对于其中一个方向,如果不能连接,就加上 C C C 。
对于第一种选择,可以这样搞:
∀
1
≤
i
≤
H
,
1
≤
j
≤
W
,
S
→
A
i
,
j
(
i
,
j
)
\forall ~1\leq i\leq H, 1\leq j\leq W,~S\xrightarrow{A_{i,j}} (i,j)
∀ 1≤i≤H,1≤j≤W, SAi,j(i,j)
对于第二种,以左上为例:
∀
1
≤
j
≤
W
,
(
1
,
i
)
→
C
T
∀
1
<
i
≤
H
,
1
≤
j
≤
W
,
(
i
,
j
)
→
0
T
,
(
i
,
j
)
→
C
(
i
−
1
,
j
−
1
)
\begin{aligned} \forall~ 1\leq j\leq W, ~&(1,i)\xrightarrow{C} T\\ \forall~ 1<i\leq H, 1\leq j\leq W, ~&(i,j)\xrightarrow{0} T, (i,j)\xrightarrow{C} (i-1,j-1) \end{aligned}
∀ 1≤j≤W, ∀ 1<i≤H,1≤j≤W, (1,i)CT(i,j)0T,(i,j)C(i−1,j−1)
[USACO21OPEN] Balanced Subsets P
容易想到一个 O ( n 5 ) O(n^5) O(n5) 的 dp \verb|dp| dp 。设 f ( i , l , r , 0 / 1 , 0 / 1 ) f(i,l,r,0/1, 0/1) f(i,l,r,0/1,0/1) 表示当前考虑到第 i i i 行,第 i i i 行选择了区间 [ l , r ] [l,r] [l,r] ,第 i i i 行的左端点为递减/递增状态,右端点为递增/递减状态的方案数,转移显然。可以发现可以用二维前缀和优化成 O ( n 3 ) O(n^3) O(n3) 。代码非常令人烦躁。
[CF-1366F] Jog Around The Graph
⇒ l u o g u \Rightarrow \rm luogu ⇒luogu 链接
分情况讨论。
对于路径长度小于等于 m m m 的,可以使用 dp \verb|dp| dp 求出答案:设 f ( i , j ) f(i,j) f(i,j) 表示走了 i i i 步,到达节点 j j j 的最长长度,转移显然,这里令不能到达的 f ( i , j ) = − ∞ f(i,j)=-\infty f(i,j)=−∞ 。
对于路径长度大于等于 m m m 的答案,设长度为 l l l,这时候路径一定不是简单路径。思考一下性质可以发现,答案的方案一定是走到某一边的一端之后,剩余都是在这条边上来回走动,换而言之,答案一定是形如 w e ( l − m ) + f ( m , u e / v e ) w_e(l-m)+f(m,u_e/v_e) we(l−m)+f(m,ue/ve) 的。这个东西很明显是一个直线的形式,但是由于坐标范围过大,不能用李超树。将其转化为维护凸包的一半,然后对于凸包上的每一个点都求出贡献。
[CF-1366G] Construct the String
⇒ l u o g u \Rightarrow \rm luogu ⇒luogu 链接
容易想到用 dp \verb|dp| dp 解决,设 f ( i , j ) f(i,j) f(i,j) 表示用 s 1 … i s_{1\dots i} s1…i 匹配 t 1 … j t_{1\dots j} t1…j 的最小花费。关键在转移,容易想到删除和匹配一个字符的转移,但是原串中的 '.' \verb|'.'| ’.’ 带来的撤回操作并不是那么好处理。但是我们可以将撤回操作和被撤回字符一起处理。具体而言,对于一个位置 i i i ,若下一个位置是一个小写字符,其被撤回的操作显然是满足 ∑ j = i k ∣ s j = '.' ∣ = ∑ j = i k ∣ s j ∈ [ 'a' , 'z' ] ∣ \sum_{j=i}^k |s_j = \verb|'.'||=\sum_{j=i}^k \left|s_j \in [\verb|'a'|, \verb|'z'|]\right| ∑j=ik∣sj=’.’∣=∑j=ik∣sj∈[’a’,’z’]∣ 的第一个 k k k ,设其为 n x t i \mathrm{nxt}_i nxti 。
那么可以得到转移:
f ( i + 1 , j + 1 ) ← s i + 1 = t j + 1 f ( i , j ) f ( i + 1 , j ) ← f ( i , j ) + 1 f ( n x t i + 1 , j ) ← s i + 1 ∈ [ 'a' , 'z' ] f ( i , j ) \begin{aligned} f(i+1,j+1) &\xleftarrow{s_{i+1}=t_{j+1}} f(i,j)\\ f(i+1,j) &\xleftarrow{} f(i,j)+1\\ f(\mathrm{nxt}_{i+1}, j) &\xleftarrow{ s_{i+1} \in [\verb|'a'|, \verb|'z'|]} f(i,j) \end{aligned} f(i+1,j+1)f(i+1,j)f(nxti+1,j)si+1=tj+1f(i,j)f(i,j)+1si+1∈[’a’,’z’]f(i,j)
答案显然为 f ( ∣ s ∣ , ∣ t ∣ ) f(|s|,|t|) f(∣s∣,∣t∣)