Atcoder Beginner Contest 276(A~G)
赛时
A 简单字符串处理;B 简单 vector 处理;C 找上一个排列。
D 找到每一个数因子 \(2\) 的个数和 \(3\) 的个数,并判断除去这些因子之后剩下的值是否相同,若不同则不能满足条件;否则计算使得所有数都只含有最少的因子 \(2、3\) 的操作总数即可。
E 从起点向周围 dfs 即可,有些白给。
F 递推处理每一张卡片加入牌堆时对于答案的贡献即可。我们设 \(dp_i\) 表示前 \(i\) 张卡片在牌堆中时所有操作的价值之和,则将价值之和除上 \(i^2\) 即为前 \(i\) 张卡片在牌堆中时所有操作的价值期望。
考虑当第 \(i\) 张卡片加入牌堆中时,增加的可能的操作一定是选一张第 \(i\) 张卡片,再选一张其它卡片。设另一张卡片为第 \(j\) 张卡片,则当 \(a_j\le a_i\) 时,我们本次操作的贡献就是 \(a_i\);当 \(a_j>a_i\) 时,我们本次操作的贡献就是 \(a_j\)。所以我们可以用两个数据结构分别支持查询一个区间的值的个数以及所有值的和,每次动态加入一个卡片时,先对两个数据结构分别作一次查询,合并信息,再将 \(a_i\) 插入数据结构中即可。
注意当 \(j<i\) 时,\((i,j)\) 和 \((j,i)\) 会对答案造成两次贡献;当 \(j=i\) 时,数对 \((i,j)\) 也会对答案造成一次贡献。这些都需要在递推的过程中考虑到。
然后由于对于组合数学不太敏感,赛时 G 就白给了没做出来,有点感觉但还是不会写.jpg
赛后
G 其实就是简单组合数,考虑用隔板法差分表示 \(n\) 张卡片的值,设 \(B\) 为 \(A\) 的差分序列,则题目中的约束条件就可以转化为:
- \(\forall i\in[2,n],b_i\equiv1\ \text{or}\ 2\ (\bmod 3)\).
- \(\sum_{i=1}^nb_i\le m\)
我们不妨先假设 \(b_i\) 对 \(3\) 取模的余数也为 \(1\) 或 \(2\),则现在要做的其实就是给 \(n\) 个隔板区间都分配一个 \(1\) 或 \(2\),再找出剩下的 \(3\) 的数量,分配给每一个区间,统计分配方案数。
我们不妨枚举 \(2\) 的数量 \(x\),则 \(1\) 的数量就是 \(n-x\),剩下的 \(3\) 的数量就是 \(num=\left\lfloor\frac{m}{n+x}\right\rfloor\) ,然后再用隔板法将 \(3\) 分给每一个 \(b_i\),但是注意 \(3\) 不一定会分完,所以不妨再多加一个隔板,将剩下的 \(3\) 分到最后一个隔板的右侧去,则根据隔板法的套路,这部分的总方案数就是:
然后在令 \(b_1\) 强制为 \(0\),再做一遍组合数,这部分的答案为:
然后将两部分的答案合起来即可。
Ex 好像是恶臭高消一类的东西,不懂,不想补。
启发
比赛隔了两天了,启发被老鼠偷走了~