模拟赛集合
8.29
模拟赛赛时的意义:拟合做题策略。
赛后订正的意义:学习 trick。
目前策略:
开场 \(1h\) 应该看过所有题面(复述题面,不引入/忽略信息)。并对每个题目进行思考(暴力/部分分/随机思考,验证正确性,细节),直至遇到瓶颈。其中重点思考前两道题目,剩余题目可以考虑先不可以刻意思考瓶颈,而是记录下来。
然后第一次代码编写顺序安排:对每道题估计时间。
如果中途遇到超过时间,需要客观评估正确性,然后决定继续调/放掉。
然后进行第二次思考和第二次代码编写。
结束前 \(10min\) 重测大样例,检查静态空间。(线上模拟赛检查线上提交)。
验证正确性的部分尤为重要,因为往往需要花费大量调试时间和心理时间接受假的事实。
8.30
提前开香槟会坠机。因为心态上容易过分自信,从而导致:
- 读错题目。
- 不想清楚细节开写。
- 过分相信代码复杂度能够通过。
- 最后不测大样例/检查空间。
zr,s1
无特殊说明。均为 1s,1024MB。
t1
给定长度为 \(n\) 的字符串。字符集为 \(3\)。分别表示向前走一步/向左转 \(90\) 度/向右转 \(90\) 度。
定义一个字符串的最终位置为,从 \((0,0)\) 出发,初始面朝北方,依次执行字符串对应指令最终走到的位置。
求所有循环移位得到的本质不同的最终位置数。
\(1 \le n \le 2 \times 10^5\)。
断环成链。变成区间查询。
注意到标记可复合。我们只关心最初的朝向,\(x,y\) 变化量,最终朝向。
上线段树维护即可。
时间复杂度 \(O(n \log n)\)。
t2
给定序列 \(a\)。一次操作可以执行前缀加 \(1\)。至多执行 \(k\) 次操作,最大化 \(\land_{i=1}^n a_i\)。
\(1 \le n \le 10^6,0 \le a_i,k \lt 2^{60}\)。
\(2s\)。
1
对每个位置增加量 \(b_i\) 考虑。发现只要满足 \(b_i \ge b_{i+1}\) 即可构造相应操作。最少操作次数为 \(b_1\)。
先二分答案 \(mid\)。然后从后往前考虑。先将 \(a_i \gets a_i+b_{i+1}\),这样 \(a_i\) 剩余的增加量变成任意。
从大到小考虑二进制位 \(j\)。如果在该位上 \(mid\) 有值,\(a_i\) 无值,则先不考虑 \(j+1\) 以上二进制位。将 \(a_i\) 加至 \(2^j\),即增加 \(2^j-(a_i \land (2^{j+1}-1))\)。
可以做到 \(O(n\log^2 V)\)。无法通过。
2
注意到找到第一个 \(mid\) 为 \(1\),\(a_i\) 为 \(0\) 的二进制位后。剩余 \(mid\) 为 \(1\) 的二进制位,\(a_i\) 均无值。换言之,增加 \((mid \land (2^{j+1}-1))-(a_i \land (2^{j+1}-1))\)。
问题变成如何快速找到 \(j\)。这可以对 \(mid\) 做补集,然后取交求 highbit。
时间复杂度 \(O(n\log V)\)。
t3
有三行 \(n\) 列的网格。一种黑白染色方案合法,等价于:
- 每列恰有一个黑格。
- 相邻列黑格不同行。
一种染色方案的权值为最大白色四联通块大小。
求合法染色方案权值的期望。
\(1 \le n \le 500\)。
期望转计数。
由于限制 \(2\),两个白色连通块至少有一个是 \(1\)。因此状态是 \(O(n^3)\)。转移是 \(O(1)\)。
t4
给定一颗 \(n\) 个点的树和 \(n\) 阶排列。
定义一个区间合法,当且仅当区间内所有点联通,且能被一条简单路径覆盖(即为一条链)。
求所有合法区间数。
\(1 \le n \le 2 \times 10^5\)。
\(2s\)。
1
有一个简单的点分治做法。
由于是排列,链必然和区间构成双射。
因此直接对合法路径计数。
点分治,对每个点到分治中心维护三元组 \((l,r,len)\) 分别表示:位置最小值,位置最大值,链长。
则两个点匹配构成的路径合法,等价于 \(\max(r_1,r_0)-\min(l_1,l_0)+1=len_0+len_1-1\)。
将相等的限制离散化一下,对每个等价类考虑。
剩下变成一个二维数点。
时间复杂度 \(O(n \log^2 n)\)。无法通过。
2
注意到一个左端点,对应的满足限制 \(1\) 的右端点是一个前缀。并且可以双指针。
问题变成了加入/删除点,每次 check 当前是否合法。
一个转化是:虚树大小等于直径 \(\times 2\)。
另一个转化是:度数不超过 \(2\)。
前者更通用,因为后者只有在排列时复杂度有保证。
限制 \(2\) 可以转化成连通块个数为 \(1\)。
可以从右往左扫描左端点,点边容斥。变成区间加,区间最小值及其个数。上线段树。
时间复杂度 \(O(n \log n)\)。可以通过。
9.4
【HT-127-Div.2】核桃CSP-S组模拟赛
t4 中的环计数。
t1
给定 \(x\) 个木头和 \(y\) 个木棍。你可以任意次用 \(2\) 个木头合成 \(4\) 个木棍。
最后你可以用 \(4\) 个木头和 \(2\) 个木棍合成 \(3\) 个栅栏。最大化最终合成栅栏的数量。
多测。
\(1 \le T \le 10^4,0 \le x,y \le 10^9\)。
枚举合成木棍次数 \(t\),则要最大化 \(\min(x-2t,y+4t)\)。
不妨二分答案 \(mid\),则要求 \(\exists t,x-2t \ge mid \land y+4t \ge mid\),即 \(\exists t,\max(0,\lceil \frac{mid-y}{4} \rceil) \le t \le \lfloor \frac{x-mid}{2} \rfloor\)。
时间复杂度 \(O(n \log V)\)。
如果根据 \(mid \bmod 4\) 的结果分讨,并且拆掉 \(\max\) 应该可以做到 \(O(n)\)。
t2
给定长度为 \(n\) 的序列 \(a\)。定义点 \(i\) 被点亮等价于 \(a_i \lt t\),其中 \(t\) 是当前时刻。
支持单点修改 \(a_i\)。每次询问给出 \(k\),询问最小时刻 \(t\),满足至少有 \(k\) 个点亮连续段。如果不存在输出 \(-1\)。
\(1 \le n,q \le 2 \times 10^5\)。
离线下来,然后离散化。
考虑点边容斥,然后在线段树上二分。
时间复杂度 \(O(n \log n)\)。
t3
给定一颗点权树,点有红/蓝/白三种颜色。你需要选出两条路径,满足端点两两不同。并且每条路径的两端点的颜色集合恰好为 \(\{\texttt{红},\texttt{白}\}\)。定义两条路径的权值为,树上被覆盖奇数次点的权值和。
输出两条路径的最大权值。
考虑每条路径在 lca 处结算贡献。不妨用将路径两种颜色端点是否被选择直接压下来。
合并儿子状态时,我们只关心当前点被覆盖的次数的奇偶性。
时间复杂度 \(O(n)\)。常数略大。
\(1 \le n \le 5 \times 10^5\)
t4
给定一个长度为 \(2n\) 的字符串,保证其中 \(L\) 和 \(R\) 各出现一次。
定义一个环合法。当且仅当环上编号构成 \(2n\) 的排列,并且相邻两点不同色。定义一个环的权值为 \(\sum_{x,y \text{相邻}}|x-y|\)。求达到最小权值的本质不同的环。
两个环本质相同当且仅当存在一种旋转/翻转方案,使得两个环上对应点编号相等。
\(1 \le n \le 10^6\)。
1
问题可以描述成:在序列上连边,要求成合法环。权值定义成每条边的长度和。
进一步,可以每条边的贡献拆到单位边 \((i,i+1)\) 上。
定义 \(c_i\) 表示边 \((i,i+1)\) 的被覆盖次数。
则答案就是 \(\sum_{i=1}^{n-1} c_i\)。
给 \(L\) 赋权值 +1,\(R\) 赋权值 -1,记 \(s_i\) 为前缀和。
不难发现 \(c_i \ge 2|s_i|\),因为最少也有 \(2|s_i|\) 条内部未消化的边。同时 \(c_i \ge 2\),否则的话答案不为环。
所以答案下界就是 \(2\sum_{i=1}^{n-1}{\max(d_i,1)}\)。
2
从前往后考虑。当 \(|d_i|\) 较 \(|d_{i-1}|\) 减少时,说明要合并两条路径。
同时特殊考虑 \(|d_i|=0\) 或者 \(|d_{i-1}|=0\) 的情况,因为最终答案是一条链,而不是若干链的集合。
比如当 \(|d_i|=0\) 时,前缀必然剩下两个端点均异色的一条路径,随机选择连接即可;
而当 \(|d_{i=1}|=0\) 时,前缀只剩下一个端点异色的一条路径,只能唯一连接。
问题是,单点和非单点是需要区分的。因为单点的两个接口本质相同,而非单点的两个接口本质不同。
有一个环计数 trick。即先钦定每个点的两个接口本质不同,最后再除以 \(2^{len}\)。这显然正确。
时间复杂度 \(O(n)\)。
9.5
ZR,S2
评价为前两题 j 组。后两题 s 组。
t1
多测。每次给出长方体和长方形。询问长方体是否能通过长方体。
显然选择长方体的一个面不劣。
t2
给定长度为 \(n\) 的序列 \(a\),以及常数 \(m,k\)。一次操作可以选择长度不超过 \(m\) 的区间,将 \(a_i\) 对 \(k\) 取 \(\min\)。
你可以进行至多一次操作。最小化 \(\sum_{i=1}^{n}a_i\)。
考虑一次操作 \(\sum a_i\) 的变化量。对 \(\min(a_i,k)-a_i\) 作前缀和。枚举序列左端点,做到 \(O(n)\)。
t3
有 \(n\) 个人排成一排。每个人会传达下面两个信息中的一个:\(\texttt{L}\),\(\texttt{R}\)。
其中有一些人是邪恶的(至少一个)。一个非邪恶的人,会传达距离它最近的人的方向(一样近取左边;在左边传达 \(\texttt{L}\),在右边传达 \(\texttt{R}\));一个邪恶的人会传达任意信息。
现在已知受损的传达信息(即有一些位确定为 \(\texttt{L}\) 或 \(\texttt{R}\),有一些位未知)。定义 \(f(S)\) 表示对于传达信息 \(S\),有多少个邪恶的人划分方案,使得传达处的信息等于 \(S\)。你需要对所有可能的 \(S\),求 \(\sum f(S)\) 对 \(998244353\) 取模的结果。
\(1 \le n \le 5 \times 10^5\)。
考虑枚举阵营,计算合法信息的数量。
记 \(S\) 表示邪恶角色的集合。注意邪恶角色的信息之外,其余角色传递的信息是唯一确定的。于是合法信息的数目为 \(2^{\#\{i \mid i \in S,\ s_i=\texttt{?}\}}\)。
同时记 \(l = \min_{i \in S}\{i\},\ r = \max_{i \in S}\{i\}\)。则限制形如:
- \([1,l-1]\) 均为 \(\texttt{R}\);
- \([r+1,n]\) 均为 \(\texttt{R}\);
- \(S\) 中相邻元素的中间部分,左半边(包含中点)为 \(\texttt{L}\),右半边为 \(\texttt{R}\)。
因此不妨定义 \(f_i\) 表示考虑了前缀 \([1,i]\),\(i \in S\) 的方案数。转移为 \(f_i = \sum_{1 \le j \lt i}f_j[(j,i) \text{ 合法}]\)。\(f_i \gets f_i+[s_i = \texttt{?}]f_i\)。
考虑 \((j,i)\) 合法的充要条件。
记 \(mxl = \max_{k \in [j+1,i-1],s_k = \texttt{L}}\{k\},\ mir = \min_{k \in [j+1,i-1],s_k = \texttt{R}}\{k\}\)。则条件为 \(mxl \le \lfloor \frac{j+i}{2} \rfloor \land mir \ge \lfloor \frac{j+i}{2}\rfloor+1\)。
按奇偶性是否相同拆拆式子,可得条件等价于 \(2mxl-j \le i-[i \bmod 2 \neq j \bmod 2] \land 2mir-j-2 \ge i-[i \bmod 2 \neq j \bmod 2]\)。
这时候 cdq 分治可以做到 \(O(n\log^2 n)\),但是不一定能通过。
考虑发掘一些性质。
发现每次移动右端点 \(r\),对左端点带来的限制形如修改 \(mxl\),或者永久赋值 \(mir\)。
前者对于 \(mxl\) 非 \(0\) 的左端点,其 \(mxl\) 均相同,因此可以直接修改。
查询前暴力移动指针(对于相同的 \(mxl\),合法的 \(l\) 显然是一段后缀),均摊移动 \(O(n)\) 次(因为查询值和修改值的总变化量之和是 \(O(n)\) 的);而后者的修改次数总和 \(O(n)\) 的,因此暴力修改即可。
用树状数组维护修改和查询,时间复杂度 \(O(n \log n)\)。
或者注意到查询右端点的移动次数总和是 \(O(n)\) 的,因此暴力移动指针,时间复杂度 \(O(n)\)。
t4
定义一个 \(n \times m\) 的棋盘局面合法,当且仅当:
- 每个位置由空地/白子/黑子组成。
- 对于所有极大同色连通块,均存在一个空地与之联通(四联通)。
现在已知受损的棋盘局面(有一些位置给定,有一些位置未知)。请求出可能的合法棋盘局面数对 \(998244353\) 取模的结果。
\(1 \le n \le 20,1 \le m \le 7\)。
考虑轮廓线 dp。你只关心每个点的颜色,每个点的连通块编号,每个棋子连通块是否与空地联通。
考虑直接 hash 然后 bfs 跑状态。
复杂度是 \(O(nm\min(n,m)S)\),其中 \(S\) 是状态数。
难点在代码实现。
参考 chy 的实现,可以将每个棋子连通块编号成最小的列编号。特殊处理空地。
维护插入元素,删除元素,判断是否合法。
可以用一整个结构体维护上述功能。
9.6
ZR,noip1
t1
给定一个长度为 \(n\) 的序列 \(a\)。定义一个长度为 \(k\) 的子序列合法,当且仅当 \(\forall j \in [2,k-1],\min(a_1,a_k) \gt a_j\)。求最长合法子序列。
\(1 \le n \le 2 \times 10^6\)。
枚举 \(\min(a_1,a_k)\),则相当于要找到右/左边最后一个大于其的元素。并查询中间小于其的元素。
这可以通过从大到小枚举 \(a_i\),维护极左/右点,并用 BIT 维护区间和实现。
时间复杂度 \(O(n \log n)\)。
t2
给定一颗树。每个点有颜色。每次询问给出两条路径。询问最大的非负整数 \(k \le n\),满足 \(\forall i \in [1,k]\),两条路径颜色恰好为 \(i\) 的点数量相等。
\(1 \le n \le 3 \times 10^5,1 \le c_i \le n\)。
给每个点随机赋权,维护和哈希。用主席树提取树上路径,在其上二分即可。
时间复杂度 \(O(n \log n)\)。
t3
给定 \(n\) 个三元组 \((i,l_i,r_i)\)。定义三元组 \((a,b,c)\) 合法。当且仅当:
- \(b \in [l_a,r_a]\);
- \(c \in [l_b,r_b]\);
- \(a \in [l_c,r_c]\)。
求合法的三元组 \((a,b,c)\) 个数。保证 \((i \notin [l_i,r_i])\)。
\(1 \le n \le 2 \times 10^5,2s\)。
普通三元环计数是不能 poly(log) 的。
考虑根号算法。先把第三个限制扫描线。问题变成每次对 \(v_i \ge x\) 的点加权值 \(v\),查询 \([l_a,r_a]\) 内的权值。
先对 \(i\) 重编号,保证两两不同。
然后分块。则修改时,整块的变化可以通过预处理整块后缀和 \(O(1)\) 修改。散块的查询可以另外再分块做到 \(O(1)\) 查询 \(O(\sqrt n)\) 修改。
时间复杂度 \(O(n \sqrt n)\)。
t4
给定一张 \(n\) 个点 \(m\) 条边的无向图。
其具有以下特殊性质:
- 对所有边 \((u,v)\),均满足 \(|\lfloor \frac{u}{k} \rfloor -\lfloor \frac{v}{k} \rfloor| \le 1\);
- 对所有的点 \(u\),集合 \(\{v|(u,v) \in E,\lfloor \frac{v}{k} \rfloor -\lfloor \frac{u}{k}\rfloor = 1\}\) 的大小至多为 \(2\)。
每条边有断掉的概率 \(p\)。定义一张图的权值为:\(\prod_{i=1}^{n}(deg_i+t)\)。其中 \(deg_i\) 是点 \(i\) 的度数,\(t\) 是给定常数。
求图权值的期望。
\(1 \le n \le 100,2 \le k \le 19,1 \le m \le 500\)。
1
考虑图不具有特殊性质怎么做。考虑将 \(deg_i\) 拆成 \(deg_i\) 个 \(1\) 相乘,然后用乘法分配律展开(即 product trick)。一张图的权值变成:每个点可以选择与之相邻一条边,贡献系数为 \(1\);或者一条边也不选,贡献系数为 \(t\)。求所有选择方案的贡献系数乘积之和。
那么可以将每个点选/不选压进状态,然后一次枚举每条边即可。
时间复杂度 \(O(m2^n)\)。
2
定义一层为 \(\lfloor \frac{u}{k} \rfloor\) 相同的点 \(u\)。如果层内暴力,然后按层转移,可以做到 \(O(m2^{2k})\) 的复杂度。
考虑到每次删除一个点,至多加入两个点,因此精细实现可以做到 \(O(2^{1.5k})\)。
我们现在要做到是:每次尽可能加入少的点,删去多的点。
考虑如下操作:先将集合大小 \(\le 1\) 的点暴力转移了。
接下来对满足 \(\exists x,(x,u),(x,v) \in E\) 的 \(u,v\) 两点加入虚边。
接着对每个虚连通块 \(dfs\),然后按 \(dfs\) 序优先转移大小不为 \(1\) 的虚连通块即可。
容易证明这样任意时刻最大状压 \(k+1\) 个点。
时间复杂度 \(O(m2^k)\)。
9.10
【HT-128-Div.2】核桃CSP-S组模拟赛
t1
给定长度为 \(n\) 的正整数序列 \(a\)。定义一个下标集合 \(S\) 的权值为 \(\min_{i \in S}\{a_i\}\max_{i \in S}\{a_i\}\)。
求所有大小为 \(k\) 的下标集合的权值和。
\(1 \le k,n \le 5 \times 10^3\)。
特判 \(k=1\)。
先对 \(a\) 排序。然后枚举最大下标 \(r\) 和最小下标 \(l\),中间再选 \(k-2\) 个数,贡献系数为 \(\binom{r-l-1}{k-2}\)。
时间复杂度 \(O(n^2)\)。
t2
给定长度为 \(n\) 的整数序列 \(a\),定义区间 \([l,r]\) 的权值为 \(\sum_{i=l}^{r}(i-l+1)a_i\)。求所有区间的最大权值。
\(1 \le n \le 2 \times 10^5\)。
拆拆式子。
\(\sum_{i=l}^{r}(i-l+1)a_i = \sum_{i=l}^{r}ia_i+(-l+1)\sum_{i=l}^{r}a_i\)。
不妨定义 \(s1_i = \sum_{j \le i}ja_j,s0_i = \sum_{j \le i}a_j\)。
则区间 \([l,r]\) 的权值为 \(s1_r-s1_{l-1}+(-l+1)(s0_r-s0_{l-1}) = (1-l)s0_r+s1_r+(l-1)s0_{l-1}-s1_{l-1}\)。
扫描左端点,则相当于插入一次函数,查询单点最值,用李超树维护即可。
由于是全局插入,时间复杂度 \(O(n \log n)\)。
t3
给定长度为 \(n\) 的整数序列 \(a\),表示每个点的颜色。定义一个区间 \([l,r]\) 的权值为 \(\texttt{popcount}(\lor_{v}ct_v)\)。其中 \(ct_v\) 表示颜色 \(v\) 在区间 \([l,r]\) 的出现次数。
询问区间权值,强制在线。
\(1 \le n,q \le 10^5\)。
1.5 单位。
1
先考虑不强制在线怎么做。这个东西显然不能 poly(log)。直接莫队,然后可以做到 \(O(n \sqrt n \log n)\)。注意到我们过程中维护每个二进制位的出现次数,和颜色的出现次数。当加入一个颜色 \(v\) 时,我们相当于找到 \(ct_v\) 二进制位上第一个空位,然后对前缀 -1,空位 +1;删除颜色找到 \(ct_v\) 二进制位上第一个 \(1\),然后前缀 +1,空位 -1。
如此,可以做到 \(O(n \sqrt n+n \log n)\)。
2
考虑在线怎么做。
发现我们莫队的过程中,只关心每个二进制位的出现次数,以及每个颜色的出现次数。
其中第一个信息只有 \(O(\log V)\),可以预处理。而后者可以在扩展时 \(O(\log n)\) 查询。
具体地,考虑分块。预处理整块与整块之间的前者信息;散块就暴力扩展。
能平衡到 \(O(n\sqrt{n \log n})\)。
t4
给定一个 \(n\) 个节点的树。给定初始点权和目标点权(均为 \(0/1\))。一次操作,可以选择一对点权相同的相邻点,然后将其点权异或 \(1\)。现在要通过若干次操作从初始点权到达目标点权,求最小操作次数。
现在初始点权和目标点权有一些位置缺失,请求出所有可能的初始点权和目标点权的操作次数最小值。
无解输出 \(-1\)。
\(1 \le n \le 2 \times 10^5\)。
3.5 单位。
1
考虑初始点权/目标点权确定的做法。
不妨给深度奇数点的点权异或 \(1\)。
则操作变成任意 \(\texttt{swap}\) 相邻两点点权。
则有解等价于 \(1\) 的点数相同。最小操作次数考虑把贡献拆到每条边上,给 \(t\) 乘 \(-1\),则答案下界是 \(\sum_{x}|s_x|\),其中 \(s_x\) 是 \(x\) 子树内的点权和。
猜测可以取到,时间复杂度 \(O(n)\)。
2
考虑 dp。
定义 \(f_{x,i}\) 表示 \(x\) 子树内 \(s_x=i\) 时的最小代价和。
合并就直接 \(\min\) 和卷积。然后枚举 \(x\) 的点权(也可以理解成初始化为 \(0\) 的 \(\min\) 和卷积),最后 \(f_{x,i} \gets f_{x,i}+|i|\)。
时间复杂度 \(O(n^2)\)。
3
发现最后转移加上的是一个凸函数。因此猜测 \(f_x\) 是凸的。
转移是 \(\min\) 和卷积。有结论这样仍然是凸函数,因此猜测成立。
凸函数考虑维护差分。比如对 \(f_x\),记其有值部分为 \([l_x,r_x]\),以 \(l_x\) 为左端点维护差分数组。
则 \(\min\) 和卷积等价于归并差分数组。
考虑 \(|x|\) 的差分 \(|x|-|x-1|\),发现在 \(x \le 0\) 时,上式值为 \(-1\);否则 \(x \gt 0\),上式值为 \(+1\)。
因此记 \(k = \min(\max(0,-l_x),r_x-l_x)\),相当于对前 \(k\) 个数区间 \(-1\),剩余的数区间 \(+1\)。
用平衡树+启发式合并维护差分数组即可。
时间复杂度 \(O(n \log^2 n)\)。但是跑得飞快。
9.12
ZR S3
t1
给定一个长度为 \(n\) 的由 \(\texttt{L},\texttt{R}\) 组成的字符串。表示第 \(i\) 个点可以向左走/向右走。求可以走出字符串的节点数。
\(1 \le n \2 \times 10^5\)。
答案是前缀极长 \(\texttt{L}\) 长度加上后缀极长 \(\texttt{R}\) 长度。
\(O(n)\)。
t2
给定长度为 \(n\) 的由 \(\texttt{0},\texttt{1},\texttt{?}\) 组成的字符串。定义一个 \(0,1\) 字符串的权值为 \(1\) 连续段的个数。求所有可能字符串的权值和。
\(1 \le n \le 2 \times 10^6\)。
求你不要再考点边容斥了,没有任何意义。
发现除非全 \(1\),否则跟序列等价,直接点边容斥是对的。
因此特判全 \(1\)。
t3
给定 \(n\) 个无色点和 \(m\) 种颜色。现在要依次用颜色 \(1 \to m\) 给点染色,每次选择相邻的两个点(若点本来有颜色则会被覆盖)。求最后所有点均被染色,可以得到的本质不同的颜色序列数。
\(1 \le n \le 4 \times 10^3,1\ le m \le 10^8\)。
1
套娃嘛。定义一个颜色序列是好的,当且仅当其能通过上述方式生成。
套路地,颜色覆盖考虑逆序。则每次加入新颜色,若其长度为 \(1\),则必须与一种已加入颜色相联;否则可以新开一段。
因此直接连续段 dp。定义 \(f_{i,j,k}\) 表示 \(i\) 种颜色,长度为 \(j\),\(k\) 个连续段方案数。
直接做是 \(O(n^3)\)。
2
上面的做题习惯错完了!先考虑子问题!考虑如何 check 一个颜色序列。
发现其必须满足如下条件:
- \(\sum len_i = n\);
- \(\forall len_i = 2,c_i \lt \max(c_{i-1},c_{i+1})\);
- \(\exists i,c_i = m\)。
发现这是充要的。因此不妨考虑对 \(c\) dp,并在过程中维护 \(c_i \gt \max{c_{i-1},c_{i+1}}\) 的点(峰值点)的数量。
具体地,定义 \(f_{i,j}\) 表示 \(i\) 个颜色 \(j\) 个峰值点的方案数。每次转移就插入最大值,发现我们只关心插入位置两旁的峰值数,由于峰值不相邻,所以位置是可以算的。
最终答案是 \(\sum_{i,j}f_{i,j}\binom{m-1}{i-1}\binom{i-j}{n-i-j}\)。
t4
那我也要会做啊?
ZR noip2
t1
定义一个正整数集合 \(S\) 的权值为集合内元素的最大公约数与 \(|S|\) 异或后的结果。
现在求所有最大值 \(\le n\) 的集合权值最大值。
\(1 \le n \le 10^{18}\)。
取全集答案已经很优了。打表发现确实如此。
所以 \(n=1\) 输出 \(0\)。
否则输出 \(n+[n \bmod 2 = 0]\)。
t2
给定一张偶数条边的无向联通图。求一组边的匹配,使得匹配两边均有公共顶点。
\(1 \le n,m \le 2 \times 10^5\)。
考虑随便找一颗生成树,然后把返祖边挂在祖先处。
考虑自下而上处理,发现每个点至多往上传一条边,并且这条边必然能与父亲与祖父的边抵消。
所以直接做即可。
时间复杂度 \(O(n)\)。
t3
给定 \(n\) 个二元组 \((a_i,b_i)\)。定义一个排列 \(p\) 的权值为,按顺序依次考虑二元组,并动态维护集合 \(S\),如果区间 \([min(a_{p_i},b_{p_i},\max(a_{p_i},b_{b_i})]\) 内不存在数,则将 \(a_i\) 加入集合 \(S\);最后权值为 \(|S|\)。
求 \(|S|\) 的期望。
1
如果考虑拆贡献。发现出现了类似循环嵌套的非子结构,这非常不好分析。
考虑将二元组按 \(a_i\) 排序。则一个二元组能被加入等价于其右/左边一段区间全空。
这时候有一个重要的性质:对于一个未决策点,你只关心其左/右边第一个点亮点。
因此你选择了第一个点亮点之后,左右两边变成了互不影响的两个子问题。
因此定义 \(f_{l,r}\) 表示 \(l,r\) 被点亮,\([l+1,r-1]\) 未决策的答案期望。
并对每个二元组 \(x\) 求出要求为空的区间 \([gl_x,gr_x]\)。
则每次枚举 \(x\) 满足 \(l \lt gl_x \land gr_x \lt r\),有转移 \(f_{l,r} \gets 1+f_{l,x}+f_{x,r}\)。
定义 \(cnt_{l,r}\) 表示合法 \(x\) 数。则有 \(f_{l,r] \gets \dfrac{f_{l,r}}{cnt_{l,r}}\)。
事实上我们不关心不合法的 \(x\) 的转移,因为其永远不可能合法,对答案的期望没有影响。
时间复杂度 \(O(n^3)\)。
2
考虑将 \(l \lt gl_x \land gr_x \lt r\) 的限制拆开。
比如从小到大枚举右端点 \(r\),对 \(f_{l,x}\),将 \(gr_x \lt r\) 的限制扫掉,然后加到对应的左端点;
对 \(f_{x,r}\),将 \(l \lt gl_x\) 的限制扫掉,维护右端点的和;
时间复杂度 \(O(n^2)\)。

浙公网安备 33010602011771号