Codeforces Round #620 (Div.2)
A. Two Rabbits
Solution
$x+at=y-bt\Rightarrow (a+b)t=y-x$.
Code
1 |
|
B. Longest Palindrome
Solution
设答案为 ans
,则 ans
不断加上具有逆序串的字符串,输出 ans
,如果有自身回文的串就任输出一个,然后 ans
翻转再输出即可。
Code
1 |
|
C. Air Conditioner
Solution
根据前一个人能调控到的温度范围,可以推知下一个人到来时能调控到的温度范围,与这个人的舒适温度范围取交,如此递推下去即可。
Code
1 |
|
D. Shortest and Longest LIS
Solution
最长 $LIS$ 的构造:只要上升,就上升到比当前最大值大 $1$ 处。
最短 $LIS$ 的构造:若某点后是一小段上升区间,那么保证上升幅度不要超过该点的前一个点。
Code
1 |
|
E. 1-Trees and Queries
Solution
从 $a$ 到 $b$ 的路径可分为两种:经过了 $(x,y)$ 和未经过 $(x,y)$ 的:
对于未经过 $(x,y)$ 的路径,$a,b$ 间的最短路径即原树上两点之间的简单路径,若该路径长度 $dis(a,b)$ 小于等于 $k$ 且奇偶性相同,则可达;
对于经过了 $(x,y)$ 的路径,有两种可能:
- $a\rightarrow x\rightarrow y\rightarrow b$,长 $dis(a,x)+1+dis(y,b)$.
- $a\rightarrow y\rightarrow x\rightarrow b$,长 $dis(a,y)+1+dis(x,b)$.
若其一长度小于等于 $k$ 且奇偶性相同,则可达。
两点之间的距离 $dis(a,b)$ 可由倍增法求 $lca$ 得到:$dis(a,b)=dep[a]+dep[b]-2*dep[lca(a,b)]$.
Code
1 |
|
F1. Animal Observation (easy version)
Solution
【参考官方题解】为方便阐述,设 $s[i][j]=\sum\limits_{i=1}^j a[i][j]$,即 $a[i][j]$ 的前缀和。又令 $Sum(i,j)$ 为第 $i$ 天在 $j\sim j+k-1$ 区域内放置摄像机能摄到的动物数量(利用 $s$ 数组 $O(1)$ 可求)
考虑 $dp$:
- $dp$ 状态:$dp[i][j]$ 表示第 $i$ 天在 $j\sim j+k-1$ 的区域放置摄像机后,前 $i$ 天一共能摄到的最多动物数量。
- 转移方程:分第 $i$ 天与第 $i-1$ 天无重叠和有重叠转移:
- 无重叠之前一天在第 $i$ 天之前:$dp[i][j]=\max\limits_{l=1}^{j-k}dp[i-1][l]+Sum(i,j)$. 其中,$\max\limits_{l=1}^{j-k}dp[i-1][l]$ 可预处理前缀最大值 $O(1)$ 调用。
- 无重叠之前一天在第 $i$ 天之后:$dp[i][j]=\max\limits_{l=j+k}^{m}dp[i-1][l]+Sum(i,j)$. 其中,$\max\limits_{l=j+k}^{m}dp[i-1][l]$ 可预处理后缀最大值 $O(1)$ 调用。
- 两天有重叠部分:由于 $k$ 比较小,循环删去重复部分即可。
- 转移顺序:由转移方程可知,依次循环即可。
- 边界条件:$dp[i][j]=0$.
复杂度 $O(nmk)$
Code
1 |
|
F2. Animal Observation (hard version)
Solution
【参考官方题解】需要把 easy version 中转移方程用数据结构维护。
三类转移方程其实可归为一个问题:求 $dp[i-1]$ 中减去重叠部分(可能为 $0$)后的最大值。对于每个 $i$,建立一颗以 $dp[i-1]$ 为基础的线段树,显然重叠部分不能循环 $j$,然后一个一个的暴力减,但我们可以用类似滑动窗口的做法做——首先减去 $dp[i][1]$ 的重叠部分,这 $k$ 个直接一个一个减就行了;然后假设我们已经减去了 $dp[i][j-1]$ 的重叠部分,在减 $dp[i][j]$ 的重叠部分时,窗口往右滑,只需要把不再覆盖 $a[i][j-1]$ 的区间 $[\max(1, j-k), j-1]$ 加回 $a[i][j-1]$,把新的覆盖了 $a[i][j+k-1]$ 的区间 $[j, \min(j+k-1, m-k+1)]$ 减去 $a[i][j+k-1]$ 即可。
复杂度 $O(nm\lg m)$
Code
1 |
|
Codeforces Round #620 (Div.2)
http://xyfjason.github.io/blog-xcpc/2020/02/15/Codeforces-Round-620-Div-2/