ABC216
A
签到
B
签到
C
一开始有一个数字\(0\),每次可以选择:
\(A\):把数字加一
\(B\):把数字乘二
怎么用\(120\)次以内的操作得到数字\(n(n\leq1e18)\)
解:
\(n\)是偶数则除二,否则减一再除二
D
有\(n\)个栈,每个栈里有\(k_i\)个数字,总共有\(2n\)个数字,其中\(1~n\)每个数字出现两次。
每次可以选择两个相同的栈顶数字消掉,能否消掉全部数字?
解:
模拟
E
有\(n(1e5)\)个数字,有最多\(k(2e9)\)次选择机会,每次选择一个\(a_i\)得到\(a_i\)的贡献并将\(a_i-1\),求最大贡献
解:
二分大于多少的数字可以全部取走,剩下的不到\(n\)的次数用堆每次挑最大的取
F
给定长度为\(n(5000)\)的数组\(A\)和\(B(a_i,b_i\leq 5000)\),求满足
\[max\{A_{i\in S}\}\geq \sum_{i\in S}B_i
\]
的非空子序列\(S\)的个数,模\(998244353\)
解:
将\(a_i,b_i\)看作一个物体的两个属性,按\(a_i\)从小到大排序,然后求任取\(j\leq i\)的\(b_j\)之和小于\(a_i\)的方案数,其实是一个背包问题
G
给定若干区间范围和数字\(s_i\),表示在区间\([l,r]\)内有\(s_i\)个1,用最少的\(1\)构造这个\(01\)序列
解:
按区间右端点排序,树状数组统计这段区间内已经有多少个\(1\)了,用并查集找到最靠右的不是\(1\)的位置改成\(1\)