2022.7 做题记录

2022.7.13

[ABC 258 E]Packing Potatoes(*1545)

非常锻炼的一道题。先像 ABC 167 D 一样把原问题转化为图上找环的问题。

\(x\bmod \sum w_i\),将数组复制两遍,在数组上进行倍增。因为 \(x< \sum w_i\),所以复制两遍原数组就应该足够了。每次位置如果 \(\ge n\) 就模 \(n\)

但是坑点很多,调了好几天/kk,注意模之后要加回来。

2022.7.14

[ABC 253 E]Distance Sequence(*1073)

前缀和优化 dp 好题。

\(f[i][j]\) 表示数列的第 \(i\) 位上的数为 \(j\) 的方案数。转移方程:

\[f[i][j]=(f[i-1][1]+f[i-1][2]+\cdots+f[i-1][j-k])+(f[i-1][j+k]+\cdots+f[i-1][m-1]+f[i-1][m]) \]

可以前缀和优化,t.c.\(O(nm)\)

2022.7.15

[ABC 246 D]2-variable Function(*1148)

定义 \(f(a,b)=(a+b)\times(a^2+b^2)\)

乍一看没啥思路,但是注意到若想让 \(f(a,b)\le10^{18}\),则需要 \(a,b\le10^6\),从 \(0-10^6\) 穷举 \(a\),求出对应的最小的 \(b\) 使 \(f(a,b)\ge n\),并在这些 \(f(a,b)\) 中取最小值,即为答案。这个过程可以通过双指针维护。

2022.7.16

开始集训了,天天垫底。

[AtCoder DP Contest M]Candies

\(f_{i,j}\) 表示前 \(i\) 个人分到 \(j\) 颗糖的方案数。

\[f_{i,j}=\sum\limits_{x=0}^{\min(a_i,j)}f_{i-1,j-x} \]

可以前缀和优化。

[AtCoder DP Contest Q]Flowers

\(f_i\) 表示以 \(i\) 结尾的答案。

\[f_i=\max\{f_x\}+a_i,\text{which}\ h_x<h_i \]

考虑到答案都在一区间内,问题转化为区间最小值,可以使用树状数组优化。

Luogu P2344 [USACO11FEB]Generic Cow Protests G

二维偏序,离散化+树状数组。和上一个题差不多,注意一些细节即可。

Luogu P5978 [CEOI2018] Global warming

Description

给定长度为 \(n\) 的数组 \(a\) ,你可以将任意一段区间 \([l,r]\) 中的每一个元素 \(+d\),其中 \(-x\le d\le x\),问一次操作后的最长上升子序列长度。

Solution

如果将 \([l,r]\) 区间内的元素都减小,可以增加 \([l,r]\)\([r+1,n]\) 连接的 LIS 长度。但这有可能减小 \([l,r]\)\([1,l-1]\) 这段的 LIS,所以我们可以贪心的想到,对于 \(d<0\) 的情况,选择 \([1,r]\) 区间一定会比 \([l,r]\) 区间更优

对于 \(d>0\) 的情况也同理。因为区间内相对大小不变,所以不难发现将 \([i+1,n]\) 加一个值的效果和 \([1,i]\) 区间减一个值的效果是相同的,所以只需要考虑 \(d<0\) 的情况。

我们进一步分析,可以发现将 \([1,i]\) 区间减的值越大一定更优。所以原问题就变成了\([1,i]\) 区间内的元素都减去 \(x\) 后,最长上升子序列的长度最大为多少

暴力修改 + LIS 的复杂度是 \(O(n^2\log n)\) 的,需要优化。考虑到修改过后区间内部相对大小不变,可以预先求出 \([1,i]\) 区间以 \(a_i\) 结尾的 LIS 长度,为 \(L_i\),设修改过后 \([i,n]\) 区间以 \(a_i\) 开头的 LIS 长度为 \(R_i\),答案即为 \(\max\limits_{i=1}^nL_i+R_i-1\)。复杂度是 \(O(n\log n)\) 的,轻松最优解。

当然,你也可以离散化后用树状数组求最大值,复杂度不变,只是代码复杂一些,欢迎读者思考。

2022.7.17

颓废,就订了个比赛。

Luogu P4303 [AHOI2006]基因匹配

Description

给定两个长度为 \(5n\) 的序列,每个序列中 \(1\sim n\) 各有 \(5\) 个,求两个序列的最长公共子序列。

Solution

\(f_{i,j}\) 表示第一个序列匹配到第 \(i\) 位,第二个序列匹配到第 \(j\) 位,能构成的最长 LCS 长度。不难列出朴素的转移方程:

\[f_{i,j}=\max\{f_{i-1,j},f_{i,j-1}.f_{i-1,j-1}+(a_i==b_j)\} \]

时空复杂度都是 \(O(n^2)\) 的,需要优化。观察本题的特殊性质,每个数都恰好出现 \(5\) 次,所以能使答案增加的位置很少,因此我们可以用 \(pos\) 记录第一个序列中每个元素出现的位置,每次转移就从这 \(5\) 个位置转移即可。对于空间,我们可以压掉一维。\(f_{i}\) 表示第一个序列匹配到第 \(i\) 位的答案,第二个序列当前位的值为 \(x\),与第一个序列第 \(j\) 个值为 \(x\) 的位置匹配的转移方程即为:

\[f_{pos_{x,j}}=\max\limits_{i=1}^{pos_{x,j}-1}f_i+1 \]

发现问题转化为求最大值,可以通过树状数组实现。复杂度为 \(O(5n\log n)\)。注意,\(j\) 要倒序穷举,因为我们用到了滚动数组。

2022.7.19

Luogu P5656 【模板】二元一次不定方程 (exgcd)

详见学习笔记

Luogu P6280 [USACO20OPEN]Exercise G

发现构成环,设环长分别为 \(a_i\),则 \(k=\operatorname{lcm} a_i\)。易知 \(k\) 是由所有 \(a_i\) 中的每个质数的最高次幂乘得。故穷举质数。

\(f_{i,j}\) 表示表示前 \(i\) 个素数总和为 \(j\) 的所有 \(k\) 的总和。穷举幂次,方程:

\[f_{i,j}=\sum f_{i-1,j-p_i^k}\times P_i^k \]

答案即为 \(\sum f_i\)

2022.7.21

Luogu P3126 [USACO15OPEN]Palindromic Paths G

首先,我们考虑如何判断回文串。不难想到从 \((1,1)\)\((n,n)\) 分别向中间走,每次走的格子上的字母相同,到中间汇合时统计一下方案数即可。

考虑 dp,状态需要记录哪些量?暴力的 dp 肯定是记录两边分别走到哪了,但这样复杂度是 \(O(n^4)\) 的,无法通过本题。发现只要知道了当前走了几步就可以由横纵坐标中的一个推出另一个,因此我们可以让 \(f_{i,j,k}\) 表示走了 \(i\) 步,两点的横坐标分别为 \(j\)\(k\) 的方案数。但还是会超空间,可以用滚动数组压一维。

转移方程:

\[f_{j,k}=f_{j,k}+f_{j-1,k}+f_{j,k+1}+f_{j-1,k+1}; \]

时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\),可以通过。

Luogu P2848 [USACO16DEC]Cow Checklist G

只提供一种满分解法。

\(f_{i,j,0/1}\) 表示 \(H\) 牛取到了第 \(i\) 个,\(G\) 牛取到了第 \(j\) 个,\(0/1\) 表示这一位取 \(H\) 牛还是 \(G\) 牛。(想想记录 \(0/1\) 的优势,既方便算出距离,又不让状态过于麻烦),\(f\) 内记录的是答案的最小值。

转移如下(直接上代码了):

f[i][j][0]=min(f[i][j][0],f[i-1][j][0]+dis(i-1,i),f[i-1][j][1]+dis(i,n+j));
f[i][j][1]=min(f[i][j][1],f[i][j-1][1]+dis(n+j,n+j-1),f[i][j-1][0]+dis(i,n+j));

初值 \(f_{1,0,0}=0\),答案即为 \(f_{n,m,0}\)

Luogu P5196 [USACO19JAN]Cow Poetry G

背包+组合数。

ABC 256 E(1224)

咕了好久,终于把坑填上了。
\(n\) 个点 \(n\) 条边,发现构成基环树森林。发现环上必有一条边不满足条件,故问题变成了找基环树森林环上的最小值加和。
实现用到并查集。

ABC 256 F(2067)

给定序列 \(A_i\),设其前缀和为 \(B_i\),其前缀和的前缀和为 \(C_i\),其前缀和的前缀和的前缀和为 \(D_i\),修改 \(A_i\),查询 \(D_i\)

树状数组。
考虑 \(A_i\)\(B_x\) (\(i\le x\)) 的贡献为 \(1\)
考虑 \(A_i\)\(C_x\) (\(i\le x\)) 的贡献为 \(x-i+1\)
考虑 \(A_i\)\(D_x\) (\(i\le x\)) 的贡献为 \(\dfrac{(x-i+1)(x-i+2)}{2}\)

\[D_i=\sum\limits_{i=1}^x\dfrac{(x-i+1)(x-i+2)}{2}A_i \]

\[D_i=\dfrac{(x+1)(x+2)}{2}\sum\limits_{i=1}^xA_i-\dfrac{2x+3}{2}\sum\limits_{i=1}^xiA_i+\dfrac{1}{2}\sum\limits_{i=1}^xi^2A_i \]

用树状数组分别维护 \(A_i,iA_i,i^2A_i\),复杂度 \(O((n+q)\log n)\)

2022.7.22

Luogu P1846 游戏

首先,有一个小 trick:把区间内的数都减 \(1\),这样得分就变成了 \(s_1\times s_2\)
进行观察,发现多对多肯定不合适,一对一最合适。但是由于两序列长度不相等,所以会出现一对多或多对一的情况,得到如下转移:
\(f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+a[i]\times b[j]\)
t.c. \(O(n^2)\).

Luogu P6359 [CEOI2018] Cloud computing

预处理背包 dp,细节挺多。题解

Luogu P1650 田忌赛马

思路奇怪的贪心/dp,感觉挺难想的。

2022.7.25

补 JROI 普及组月赛。挺有思维含量的吧。

T3 的题解
T4 的题解

P1136 迎接仪式

dp,需要 0/1 记录当前位。

2022.7.27

[ABC164E] Two Currencies

分层图最短路。细节。

2022.7.28

Luogu P2886 [USACO07NOV]Cow Relays G

矩阵快速幂优化 Floyd。

P1613 跑路

Floyd.

2022.7.30

P1908 逆序对

树状数组求逆序对板子。

CF1276B Two Fairs

乘法原理+简单容斥。

2022.7.31

P3252 [JLOI2012]树

前缀和,桶。

P1730 最小密度路径

Floyd

P2980 [USACO10FEB]Covering the Corral G

细节超多!!!!

posted @ 2022-07-19 21:12  lnwhl  阅读(45)  评论(1)    收藏  举报