AtC and CF 做题笔记

ABC308

D

因为 snuke 长度只有 \(5\),所以可以记搜,设 \(f_{x,y,now}\) 表示在位置 \((x,y)\),要匹配 snuke 的第 \(now\) 个字符,可不可以。

注意 \(now\) 要取余,以免超出长度限制,然后如果位置 \((x,y)\) 的字符不等于 snuke 的第 \(now\) 个字符直接返回 \(0\),搜到了 \((h,w)\) 就返回 \(1\)

E

考虑枚举中间的 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

如果没有删除操作的话,只需要维护一个 01 trie,每次插入一个数的时候询问最小值即可。

但是现在有了删除,在 trie 上删除不难,但是之前计算到的答案难以去掉。发现每个数都有一个存活区间,于是直接上线段树分治。时间复杂度 \(\mathcal{O}(q \log q \log V)\)

ARC116

A

考虑用 \(2\) 来刻画偶数,那么令 \(n=2^d \times a\)\(a\) 是奇数,假设 \(a\)\(m\) 个约数,那么 \(n\) 就有 \(m\) 个奇约数和 \(dm\) 个偶约数,那么答案显而易见。

B

可以先给 \(a\) 排序。

枚举 \(\max\) 的位置 \(i\),再枚举 \(\min\) 的位置 \(j \le i\),中间有 \(i-1-(j+1)+1=i-j-1\),假设没有 \(i=j\) 的情况,则 \(ans=\sum_{i=1}^n \sum_{j=1}^{i-1}a_ia_j2^{i-j-1}=\sum_{i=1}^n a_i2^i\sum_{j=1}^{i-1}\frac{a_j}{2^{j+1}}\)。加上 \(i=j\) 即可。

C

如果直接 dp 的话,要同时考虑序列长度和最后所选的数,时间复杂度不会低于 \(\mathcal{O}(nm)\)

那么考虑组合数学。那么去考虑最后一个数,这样得以知道全局的信息。

对于最后一个数的每个质因数 \(p\),它们的质数是一个单调不降的序列,注意必须是质因数。

现在问题变成求值域在 \([0,k]\),长度为 \(n-1\) 的不降序列个数,因为最后一个数已经知道。

每个数加上 \(i\),转化为值域在 \([1,n+k-1]\),长度为 \(n-1\) 的严格上升序列个数。

另一种做法是,考虑这个序列真正发生变化的位置不会超过 \(\log n\) 个,那么设 \(f_{i,j}\) 表示总共有 \(i\) 种数,最后一个数为 \(j\) 的方案数。那么转移是平凡的。

统计答案就考虑枚举数的个数后插板,要求每一段都不能为空,就是 \(\sum_{i=1}^{\lfloor \log_2 n \rfloor} \binom{n-1}{i-1}\sum_{j=1}^m f_{i,j}\)

D

纯正的 dp 同样是 \(\mathcal{O}(nm^2)\) 的,考虑抛弃掉 \(n\)\(m\) 中的一维。

明显抛弃掉 \(n\) 是比较好维护的,然后设计 dp 状态,对于位运算的题,可以直接把位数塞到状态里,这样会方便维护一些。尤其是这个题关注的是和,而想知道贡献就必须知道它是哪一位。

\(f_{i,j}\) 表示考虑了从低到高的前 \(i\) 位,和为 \(j\) 的方案数。

初值为 \(f_{0,j}(2|j)=\binom{n}{j}\)

枚举第 \(i\)\(1\) 的数量,得到方程 \(f_{i,j}=\sum_{k=0}^n [2|k ]\binom{n}{k}f_{i-1,j-k \times 2^i}\)

答案为 \(f_{20,m}\)

E

考虑二分后的判定问题:你需要保证每个点都有一个距离不超过 \(mid\) 的关键点,求最小需要的点数。

首先有一个正确的贪心,就是你考虑每个没被标记的点,在它的 \(mid\) 级祖先上标记。从最深的的点依次进行这个过程即可。

什么时候必须放一个点?那就是存在一个没有被标记的点且距离 \(\ge mid\),但是一个点的标记还会影响到它的上面,怎么维护一个点有没有被标记呢?首先没被标记的点肯定是离当前最远的一个。谁最有可能标记它呢,必然是最近的一个标记了的点,但也有可能是上面的点啊,但是我们标记一个点它的距离已经 \(\ge mid\) 了那么上面肯定标记不到这个点。还有一个点是当前点,还需要考虑它的问题。如果下面的点覆盖不了它,就需要上面来覆盖它。

那么这个怎么实现呢,可以记 \(f_i\) 表示 \(i\) 的子树中没被标记的点与 \(i\) 的最远距离,\(g_i\) 表示 \(i\) 的子树中被标记的点中与 \(i\) 的最近距离。\(f\) 取 max,\(g\) 取 min,如果不存在没标记的点,那么 \(f_i=-\infty\);如果不存在标记了的点,那么 \(g_i=\infty\)

但是,有些点是指望着上面来标记它的,这些点的覆盖情况又如何呢?再考虑每个点为根的子树时,我们唯一没有保证,把问题丢到上面的只有当前的根,所以最后唯一可能还没有被标记的点就是 \(1\) 号点。

ARC160

B

同时满足这三个条件的话,总会有一个数不超过 \(\sqrt N\),可以从这里入手。

令 $B=\lfloor \sqrt N \rfloor $,那么对于 \(1 \le x,y,z \le B\) 的都可以,贡献为 \(B^3\)

否则,存在一个数 \(>B\),那么另外两个数与他的乘积不超过 \(N\),所以两个数都不超过 \(\frac{N}{B}\)

那么这部分的答案就是 $3\sum_{i=B+1}^N \lfloor \frac{N}{i}\rfloor^2 $。这里,两个小的数的平方也规定了这两个数的位置关系,所以只需要考虑最大的数放哪里即可。

Obviously,这样做一定是不重不漏的。

ARC174

A

设前缀和为 \(S\),选 \([l,r]\),那么答案为 \(S_{l-1}+S_n-S_r+C(S_r-S_{l-1})\)

所以要最大化 \((C-1)(S_r-S_{l-1})\),这其实就是增量。

那么,若 \(C-1 \ge 0\),就是求最大子段和。

否则,就是求最小子段和,或者说,取反后的最大子段和。

我们选择的求法是枚举 \(r\),那么 \(S_{l-1}\) 越小越好。

B

进行一个推柿子,设 \(w_i\) 表示新加入的 \(i\) 的数目。

那么 \(-2w_1-w_2+w_4+2w_5-2a_1-a_2+a_4+2a_5 \ge 0\)

把定数挪到右边,那么 \(-2w_1-w_2+w_4+2w_5 \ge K=2a_1+a_2-a_4-2a_5\)

注意到 \(w_1,w_2\) 是在减,那么狗都不选,化为 \(w_4+2w_5 \ge K\)

如果选两个 \(w_4\),贡献与两个 \(w_5\) 相同,所以如果 \(w_5\) 便宜就用 \(w_5\),否则就用两个 \(w_4\)

ARC183

C

对这个限制做一些描述,那么考虑用最大值划分子问题,钦定了最大值后,一段序列就被分成了两个不相交的部分。这样的形式加上 \(500\) 的数据范围,自然地想到区间 dp。

\(f_{l,r}\) 表示 \([l,r]\) 的方案数,枚举最大值的位置 \(l \le k \le r\),要求是 \(k\) 可以成为最大值的位置。那么 \(f_{l,r}\larr \binom{r-l}{k-l}f_{l,k-1}f_{k+1,r}\),理解为从最大数以外选 \(k-l\) 个数放到左边。为避免越界,令 \(f_{i+1,i}=1\)

能不能放怎么办呢,\(m\)\(10^5\),考虑固定一个端点后扫描线。假设我们要固定 \(l\),那么计算 dp 值需要用到的是 \(f_{l,?}\)\(f_{?,r}\) 的形式,前面一个由于 \(k-1 < r\) 已被计算,由于后面的 \(k+1 >l\),所以倒序枚举 \(l\) 即可解决问题。

posted @ 2024-01-01 11:21  aCssen  阅读(17)  评论(0)    收藏  举报