VP 2023 ICPC 沈阳
The 2023 ICPC Asia Shenyang Regional Contest
The 2nd Universal Cup. Stage 13: Shenyang
Date 2025.08.24
Solved 6 / 13
A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Ø | O | 待补 | O | O | O | O |
B. Turning Permutation
字典序问题的一个经典 trick 是按位确定一串前缀,然后算出后面随便放的方案数,和 k 做比较。这样的话就是外面 $O(n ^ 2)$,里面套个计数
考虑怎么计数,一个经典套路是 对值 $1…n$ 依次确定位置
设
$$
dp[i][j][t]
$$
- 已处理完 $1…i$
- $j$:$i$ 在当前 未确定后缀 的相对位置($j=0$ 表示已固定到前缀)
- $t=0/1$:$i-1$ 在 $i$ 左 / 右
维护一个 len
表示后缀长度,按 $i$ 递增转移到 $i+1$:
- 若 $i+1$ 已在前缀:直接根据相对位置继承/过滤状态;
- 否则:
- 若 $t=0$($i-1$ 在 $i$ 左):$i+1$ 也必须在右 ⇒ $nj \in [1,j]$
- 若 $t=1$($i-1$ 在 $i$ 右):$i+1$ 必在左 ⇒ $nj \in [j+1,len+1]$
对区间内位置累加,方向翻转t^1
。
细节比较多,看代码
1 |
|
M. Outro: True Love Waits
s 走到 t 等价于 0 走到 s xor t
那么题目 相当于先从 0 走到 s xor t,然后重复 k - 1 遍 s xor t 到 s xor t (相当于 0 走到 0)
从 0 走到 0 就是经典的 0 ^ 1 ^ 2 ^ 3 = 0,由于每次走完那条边会被删除,相当于消耗两个低位的 0。
那么无解的情况就是 s xor t 低位的连续的 0 的数量不够。
第 k 次到达 0 的步数就是 $s_k = \sum_{i = 1}^{k - 1} 4 ^ i$。
然后按照上面的分步骤算一算就行了
1 | const int N = 1e6 + 5; |
K. Maximum Rating
关于最高 Rating 变化次数:
若要最小化,则前面一直掉分,后面一直上分。而且后面上分的值从小到大。相当于要在一个前缀上面二分
若要最大化,则前面一直上分,后面一直下分。且次数为正数数量。
很容易构造出方案使得 [min, max] 之间的次数都能被取到
用线段树维护一下带修的即可
1 | const int N = 1e6 + 5; |
E. Sheep Eat Wolves
(i, j, 0 / 1) 为状态,表示河对面有 i 只羊,j 只狼,农夫在 家 / 对面。
用 BFS DP 即可。
1 | void solve() { |
J. Graft and Transplant
每一步操作会恰好让叶子数量增加 1,直到 n - 1。
n = 2 的情况需要特判。
1 | void solve() { |
C. Swiss Stage
签到,模拟即可
1 | void solve() { |
VP 2023 ICPC 沈阳