ABC308
\(\operatorname{A}\sim \operatorname{F}.\)
A
按题意模拟即可。
B
用 map
存一下即可。
C
考察 sort
的应用,但是胜率要开 long double
存。
D
因为 snuke
长度只有 \(5\),所以可以记搜,设 \(f_{x,y,now}\) 表示在位置 \((x,y)\),要匹配 snuke
的第 \(now\) 个字符,可不可以。
注意 \(now\) 要取余,以免超出长度限制,然后如果位置 \((x,y)\) 的字符不等于 snuke
的第 \(now\) 个字符直接返回 \(0\),搜到了 \((h,w)\) 就返回 \(1\)。
E
感觉 E > F 啊?
考虑枚举中间的 E
,然后分别统计下其左边的字符 M
中 \(a\) 中值为 \(0,1,2\) 的数量,记为 \(l_1,l_2,l_3\),右边也同理,记为 \(r_1,r_2,r_3\),这个可以用前缀和做出。
然后分类讨论:
- 如果当前为的 \(a\) 值为 \(0\),那么
mex
可以取到 \(1,2,3\):
mex=1
,因为已经出现过 \(0\) 了,所以左右两个数都是随便选,不取到 \(1\) 即可,那么答案加上 \((l_1+l_3) \times (r_1+r_3)\)。
mex=2
,那么必须出现一个 \(1\),当 \(1\) 在左边时右边随便选,\(1\) 不在左边时右边必须选 \(1\),那么对答案的贡献就是 \(2 \times (l_2 \times(r_1+r_2)+l_1 \times r_2)\)。
mex=3
,那么 \(0,1,2\) 都要有,分别考虑左边为 \(1\) 和左边为 \(2\),用乘法原理拼起来即可,对答案的贡献为 \(3 \times(l_2 \times r_3+l_3 \times r_2)\)。
其它的也类似,mex=0
没有贡献,不用考虑。
核心代码:
if(!a[i]){
ans+=1ll*((l1+l3)*(r1+r3));
ans+=2ll*(l1*r2+l2*(r1+r2));
ans+=3ll*(l2*r3+l3*r2);
}
if(a[i]==1){
ans+=2ll*(l1*(r1+r2)+l2*r1);
ans+=3ll*(l1*r3+l3*r1);
}
if(a[i]==2){
ans+=1ll*(l1*(r1+r3)+l3*r1);
ans+=3ll*(l1*r2+l2*r1);
}
F
没有优惠时要付所有的钱,然后每一张优惠券可以减去它的 \(d\),那么就有贪心策略:将优惠券按 \(d\) 从大到小排序,依次处理。
处理考虑决策包容性,为了让其他优惠券尽量能用,我们选择大于等于这张优惠券的 \(l\) 的最小的 \(p\),然后使用它,将这个 \(p\) 删去。
用平衡树优化这个过程,时间复杂度 \(\mathcal{O}(n \log n)\)。
补题部分: