【比赛记录】 AtCoder Beginner Contest #273

Problems:

# Name Submit
A A Recursive Function Submit
B Broken Rounding Submit
C (K+1)-th Largest Number Submit
D LRUD Instructions Submit
E Notebook Submit
F Hammer 2 Submit
G Row Column Sums 2 Submit
Ex Inv(0,1)ving Insert(1,0)n Submit

感觉一直设计不好 DP 的状态,被 FG 两道 DP 暴杀qwq。
感觉 DP 的状态就是蛮先设计看看,试一下能不能转移,转移过程中需要知道那些东西,
时空复杂度如何,能否优化之类的,在尝试中调整。

题解:

A: A Recursive Function

阶乘。

B: Broken Rounding

对于每个 \(i\)\(x=\lfloor x/10^i+0.5\rfloor \times 10^i\)

C: (K+1)-th Largest Number

去重后排序即可求出大于 \(a_i\) 的不同的数的个数,统计对应答案。

D: LRUD Instructions

调了好久,wtcl。
记录出现过的行和列上障碍的位置,移动时判断移动方向上是否存在障碍。
对于没有障碍的行列,判断是否移至边界即可;
对于有障碍的行列,判断是否会被障碍阻挡即可。
记得离散化。

  • lower_bound(first,last,x) 求出 \([~\text{first},\text{last}~)\) 中第一个大于等于 \(x\) 的位置 。
  • upper_bound(first,last,x) 求出 \([~\text{first},\text{last}~)\) 中第一个大于 \(x\) 的位置 。

E: Notebook

每次至多添加一个数,删除最后一个数,询问最后一个数。
用链表维护每个数的前一个数,用一个指针记录当前位置,
用数组记录某一页对应的最后一个数的位置。
模拟一波,记得离散化。
其实整个结构更像树一些。

F: Hammer 2

首先离散化原点,终点,墙和锤子的位置。
\(f_{i,j,0}\) 表示区间 \([i,j]\) 都可行走且此时位于 \(i\) 处,
\(f_{i,j,1}\) 表示区间 \([i,j]\) 都可行走且此时位于 \(j\) 处。
转移时若不是墙,则可直接拓展。
若是墙,若对应锤子不位于 \([i,j]\) 内,则不可以拓展;
若对应锤子不位于 \([i,j]\) 内,则有:

\[f_{i-1,j,0}=\min{\{f_{i-1,j,0}, f_{i,j,0}+\text{dist}(i-1,i),f_{i,j,1}+\text{dist}(i-1,j)\}} \\ f_{i,j+1,1}=\min{\{f_{i,j+1,1}, f_{i,j,0}+\text{dist}(i,j+1),f_{i,j,1}+\text{dist}(j,j+1)\}} \]

记原点对应位置为 \(p\) ,则初始值为 \(f_{p,p,0}=f_{p,p,1}=0\) ,表示初始时位于原点处。

G: Row Column Sums 2

显然当 \(\sum R_i\neq\sum C_i\) 时答案为 \(0\)
考虑 DP 求解,尝试设计 DP 的状态,考虑填完前 \(i-1\) 行,正在填第 \(i\) 行。
思考发现,我们需要知道填完前 \(i-1\) 行后,列中 \(1\)\(2\) 的个数,分别记为 \(x\)\(y\)
于是设 \(f_{i,x,y}\) 表示填完前 \(i\) 行,列中剩余 \(x\)\(1\)\(y\)\(2\) 的方案数。
转移时分类讨论:

  • \(R_i=0\) 时,显然 \(f_{i,x,y}=f_{i-1,x,y}\)
  • \(R_i=1\) 时:
    • 若第 \(i\) 行填在为 \(1\) 的列,则 \(f_{i,x,y}=(x+1)\times f_{i-1,x+1,y}\)
    • 若第 \(i\) 行填在为 \(2\) 的列,则 \(f_{i,x,y}=(y+1)\times f_{i-1,x-1,y+1}\)
  • \(R_i=2\) 时:
    • 若第 \(i\) 行在一个为 \(2\) 的列填 \(2\),则 \(f_{i,x,y}=(y+1)\times f_{i-1,x,y+1}\)
    • 若第 \(i\) 行在一个为 \(2\) 的列填 \(1\),一个为 \(1\) 的列填 \(1\),则 \(f_{i,x,y}=x\times(y+1)\times f_{i-1,x,y+1}\)
    • 若第 \(i\) 行在两个为 \(2\) 的列填 \(1\),则 \(f_{i,x,y}=\left({\matrix{y+2\\2}}\right)\times f_{i-1,x-2,y+2}\)
    • 若第 \(i\) 行在两个为 \(1\) 的列填 \(1\),则 \(f_{i,x,y}=\left({\matrix{x+2\\2}}\right)\times f_{i-1,x+2,y}\)

值得注意的是,填为 \(2\) 的列会影响为 \(1\) 的列的个数,填为 \(1\) 的列不会影响为 \(2\) 的列的个数。
这样做虽然正确,但是会爆时空限制,但也不难发现,若记 \(\text{rest}=\sum\limits_{j=i}^n R_j\) ,则有:

\[\text{rest}=x+2\times y \]

因此 \(x\)\(y\) 之间可以互相表示,知一求一(雾。
因此可以略去一维,实际实现时略去 \(x\) 的一维更简洁,
不需要判断 \(\text{rest}-x\bmod 2\) 是否等于 \(0\)

Ex: Inv(0,1)ving Insert(1,0)n

不会,留坑qwq。

posted @ 2023-02-26 19:57  loctopus  阅读(48)  评论(0)    收藏  举报