2024.7.16 test

7.16

A

给定 \(m=\frac{n(n+1)}{2}\) 个线段,分别为 \([l,r]\),其中 \(1\le l\le r \le n\),两两不同,每条线段选或不选,总共 \(2^m\) 种情况中,问最多能选出 \(k\) 条互不相交的线段的方案数,\(n,k\le 500\)

这是一个贪心的过程。设 \(f_{i,j}\) 表示当前填了最的右端点为 \(i\),已经填了 \(j\) 个区间的方案数。
那么我们想,从 \(i\) 转移到 \(k\),贡献是怎么算的,首先左右端点在 \([i+1,k-1]\) 里的都不能选,
其次,左端点在 \([i+1,k]\),且右端点为 \(k\) 的至少选一个,贡献 \(2^{k-i}-1\)
再然后,穿过了 \(i\) 这个点的线段就可以随便选了,无论怎么选对答案都没有影响,贡献 \(2^{i\times(k-i)}\)
最后,\(f_{i,k}\) 对答案的贡献是 \(2^{i\times(n-i)}\)

B

给定 \(k\le 100\) 个两两互质的数,问在 \([1,n]\) 区间里有多少数能被这 \(k\) 个数中任一数整除。\(n\le 10^{13}\).

我们直接暴力上 dfs+容斥,可以跑过 \(n\le 10^{11}\) 级别的数据。
但是其实这样做是有重复的状态的,如果 \(x,y\) 满足 \(n/x=n/y\)(整除),那么 \(x,y\) 是可以合并的。
考虑 dp,设 \(dp_{i,j}\) 表示前 \(i\) 个数,在 \([1,j]\) 里有多少个数能被整除。
那么 \(dp_{i,n}=dp_{i-1,n}+n/a_i-dp_{i-1,n/a_i}\),这是跟容斥的式子一样的。
我们这样设是把所有重复的状态合并了的,状态数是 \(O(k\sqrt n)\),就这样。
具体的实现可以时间换空间。

C

你要维护一个 01 序列,每次把一个区间的数全部取反,并询问这个区间最长的 \(0...01...1\) 串的长度。\(n,m\le 5e5\).

线段树,在每个节点存储:左侧第一个极长颜色段及其颜色,左侧第二个极长颜色段,右侧第一个极长颜色段及其颜色,右侧第二个极长颜色段,区间内最长的 \(01\) 串,区间内最长的 \(10\) 串(供翻转用)。

D

一个无限序列 \(s\) 如此构造,一开始序列为空,每次把前 \(k\) 小的序列中没出现过的数插入序列末尾,并把这 \(k\) 个数的和也插入序列末。\(T=1e5\) 次询问,给定 \(k\),问 \(n\) 在序列出现的位置。\(n\le 1e18,k\le 100\).

posted @ 2024-07-17 19:26  s1monG  阅读(1)  评论(0编辑  收藏  举报