【比赛记录】 AtCoder Beginner Contest #273
Problems:
# | Name | Submit |
---|---|---|
A | A Recursive Function | ![]() |
B | Broken Rounding | ![]() |
C | (K+1)-th Largest Number | ![]() |
D | LRUD Instructions | ![]() |
E | Notebook | ![]() |
F | Hammer 2 | ![]() |
G | Row Column Sums 2 | ![]() |
Ex | Inv(0,1)ving Insert(1,0)n | ![]() |
感觉一直设计不好 DP
的状态,被 F 和 G 两道 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]\) 内,则有:
记原点对应位置为 \(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\) ,则有:
因此 \(x\) 和 \(y\) 之间可以互相表示,知一求一(雾。
因此可以略去一维,实际实现时略去 \(x\) 的一维更简洁,
不需要判断 \(\text{rest}-x\bmod 2\) 是否等于 \(0\) 。
Ex: Inv(0,1)ving Insert(1,0)n
不会,留坑qwq。