杂题20200309

CF1313E Concatenation with intersection

给定三个串 \(a,\ b,\ s\) 其中 \(|a|=|b|=n,\ |s|=m\) ,求出四元组 \((l1,\ r1,\ l2,\ r2)\) 的个数,满足:

  1. \([l1,\ r1]\)\([l2,\ r2]\) 交集非空
  2. \(a_{l1\cdots r1}+b_{l2\cdots r2}=s\)

\(n\leq5\times10^5;\ m\leq2\cdot n\)

\(A_i\)\(a_{i\cdots n}\)\(s\) 的最长公共前缀, \(B_i\)\(b_{1\cdots i}\)\(s\) 的最长公共后缀,可以用 z算法 求出

条件 \(1\) 可以看做 \(\begin{cases}l1\leq r2\\l2\leq r1\end{cases}\) ,同时 \(r1-l1+1+r2-l2+1=m\) ;将 \(r1=l1+l2-r2-2+m\) 带入 \(l2\leq r1\) 可以得到 \(l1\leq r2\leq l1+m-2\) ,可以发现能够只枚举 \(l1,\ r2\) 丢掉 \(r1,\ l2\) 计算答案,答案为 \(\displaystyle\sum_{l1=1}^n\sum_{r2=l1}^{l1+m-2}\max(A_{l1}+B_{r2}-m+1,\ 0)\)

倒着枚举 \(l1\) ,维护 \(B_i\) 值域后缀和即可


AGC147F Sum Difference

给一个首项为 \(X\) ,公差为 \(D\) ,项数为 \(N\) 的等差数列 \(A\) ,定义 \(w(S)=\displaystyle\sum_{i\in S}A_i-\displaystyle\sum_{i\notin S}A_i\) 。对于所有 \(S\subseteq{1,\ 2,\ \cdots,\ N}\) ,统计有多少种不同的 \(w(S)\)

\(N\leq2\times10^5;\ |X|,\ |D|\leq10^8\)

\(w(S)=\displaystyle\sum_{i=1}^NA_i-2\displaystyle\sum_{i\in S}A_i\) ,统计 \(\displaystyle\sum_{i\in S}A_i\) 即可;若 \(D<0\) ,改为 \(X'=X+(n-1)\cdot D,\ D'=-D\) 答案不变

观察到原式形如 \(kX+sD\) ,固定了 \(k\) 之后该式是公差为 \(D\) 的等差数列,因为 \(sD\) 部分一定可以通过调整得到介于 \(s\) 可取的最小值最大值的数

对于 \(kX\bmod D\) 相同的 \(k\) 将所有 \(sD\) 求区间并即可。需要特殊考虑 \(D=0\) 的情况与答案 \(0\)


CF893E Counting Arrays

\(q\) 次询问,每次给定两个数 \(x,\ y\) ,统计长为 \(y\) 的整数序列满足:乘积为 \(x\) (可以有负数)。答案对 \(10^9+7\) 取模

\(q\leq10^5;\ x,\ y\in[1,\ 10^6]\)

整数序列中每个数的值与符号显然可以分开考虑,符号的贡献为 从 y 个不同数中选择偶数个数的方案数,可以发现答案为 \(2^{y-1}\) ,因为选择偶数个数的方案数等于选择奇数个数的方案数

接下来将 \(x\) 拆成 \(\displaystyle\prod p_i^{c_i}\) ,对于每一个质因数 \(p_i\) ,塞 \(c_i\) 个它到整数序列中,即统计 在 m 个不同盒子中放 n 个相同的球,盒子可以为空 的方案数,使用插板法得到答案为 \(\displaystyle\binom{n+m-1}{m-1}\) 。可以暴力分解 \(x\) 求答案


CF1316E Team Building

你需要组建一支排球队。为了组织一支排球队,你需要为队伍里的 \(p\) 个不同的位置,从 \(n\) 个人中选出 \(p\) 个人,且每个位置上都恰好有一个人。另外还需要从剩下的人中选出恰好 \(k\) 个人作为观众。

对于第 \(i\) 个人,已知他作为观众时能为队伍增加 \(a_i\) 点力量,他在队伍的第 \(j\) 个位置上时能为队伍增加 \(s_{i,\ j}\) 点力量。请问这只排球队力量的最大值是多少?

\(n\leq10^5;\ a_i,\ s_{i,\ j}\in[1,\ 10^9];\ 1\leq p\leq7,\ 1\leq p+k\leq n\)

将每个人按 \(a_i\) 降序排序,这样对于没有成为 \(p\) 个人之一的人只需要靠前选择即可,因此可以列出 dp ,记 \(f_{i,\ S}\) 为考虑到排序后前 \(i\) 个人,状态 \(S\) 的位置已被选择,所得权值的最大值。注意 dp 初值为 \(-\inf\)


CF1083C Max Mex

给定一棵 \(n\) 个点的带点权树,所有点权构成了 \(0,\ 1,\ \cdots,\ n-1\) 的排列,有 \(q\) 次操作,每次操作为:

  1. 交换两个点的点权
  2. 找到一条路径使得这条路径所有点权的 \(\operatorname{mex}\) 最大

\(n,\ q\leq2\times10^5\)

从权值考虑,用线段树维护一段区间的点权能否被包含在一条链中并维护这条链,合并两个区间讨论一下维护 lca 即可,询问最大 \(\operatorname{mex}\) 路径线段树二分即可

posted @ 2020-03-09 09:02  cnJuanzhang  阅读(114)  评论(0编辑  收藏  举报