A
表达式已经划分好运算顺序,根据运算顺序分治。分别统计一个区间为0,1,?的方案数,区间合并时再根据符号的运算特点合并,个人认为是码量最大的一道题,放个代码。
代码
B
d p i = d p j + s i − s j + 1 ( j + 2 + m − 1 ≥ i ) dp_i=dp_j+s_i-s_{j+1}(j+2+m-1 \geq i) dpi=dpj+si−sj+1(j+2+m−1≥i),裸的单调队列优化dp。
C单调栈
60分容易想到枚举栈1栈顶元素 i i i,计算合法方案数为 2 × 3 i − 1 × 2 m − i − i − 1 2\times3^{i-1}\times2^{m-i-i-1} 2×3i−1×2m−i−i−1(栈1,2互换概率,前 i − 1 i-1 i−1 三个都可以填, i + 1 i+1 i+1 到 m − i − 1 m-i-1 m−i−1 两个都可以填)。
设栈1栈顶元素为 i i i 的方案数为 p i p_i pi。100分就是将 2 m 2^m 2m 和 3 n 3^n 3n 的逆元 提出后发现 p i + 1 = p i × 3 4 p_{i+1}=p_i\times \frac34 pi+1=pi×43,等比数列求和。
坑点
注意边界, i i i 和 m − i m-i m−i 都要大于0。
D重组基因
提示
虽然是字符串题但最主要想法和字符串无关,字符串相关算法好像主要是跟字符串匹配和回文串有关。
不要被字符串限制住,想想将字符换成数字是否会影响解法。
做法
从后往前维护字典序单调递减的单调栈 s t st st。显然如果有字符串在当前字符前面还比当前字符大,当前字符一定不会被使用。
栈输出时还要记得判断 s t i st_i sti 和 s t i + 1 st_{i+1} sti+1 的大小,因为 s t i st_i sti 有可能因为刚才把 s t i − 1 st_{i-1} sti−1 输出了而导致比 s t i + 1 st_{i+1} sti+1 小。
对于字典序大小判断可以用二分哈希找出的一个不同的位置比较。