Codeforces&Atcoder VP记录

发布时间 2024-01-01 11:26:20作者: aCssen

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)\)

补题部分:

G