一些题(十二)

[CF1305H] Kuroni the Private Tutor

考虑如何判断一个分数序列 \(\{s_i\}_{\ge}\) 是否合法,可以建出上下界最大流模型,那么有解当且仅当有可行流(此时可以只考虑下界)且最大流为 \(\sum s_i\)(此时可以只考虑上界),可以转化为最小割来分析得到限制:\(\forall 0\le x\le n,0\le y\le m,xy+\sum_{i>y} s_i\ge \max\left(t-\sum_{i>x}r_i,\sum_{i\le x} l_i\right)\)。这可以枚举 \(x\) 然后在 \(\left(y,\sum_{i>y}s_i\right)\) 的凸包上双指针找使得左边最小的 \(y\) 来做到 \(O(n+m)\) 判断。考虑求答案,可以先二分并列第一的人数在二分分数。注意到上面的条件意味着 \(s\) 的每个后缀和越大越好,于是在满足给定条件的情况下每次个最小值 \(+1\) 即可构造出一个最优的 \(s\) 然后判断即可,这个过程可以 \(O(n)\) 模拟。

[CF1644F] Basis

首先特判掉 \(n=1\)\(k=1\) 的情况。考虑什么样的串一定不能被别的串通过 \(F\) 操作得到,发现正是哪些去掉最后一个同色连续段后,其它同色连续段长度 \(\gcd=1\) 的串。而把这些串选进基里后其它串都能被表示出了。考虑计数,枚举除去最后一个连续段后剩下的长度 \(m\),通过莫比乌斯反演可得答案为:

\[\sum_{m=1}^{n-1}\sum_{d|m}\mu(d)\sum_{i=1}^{\min(m/d,k)}{m/d\brace i}\min(i,k-1)\\ =\sum_{d=1}^{n-1}\mu(d)\sum_{i=1}^k\min(i,k-1)\sum_{m=1}^{\lfloor(n-1)/d\rfloor}{m\brace i}\\ \]

对于后面形如 \(\sum_{m=1}^n {m\brace i}\) 的东西,可以变形为:

\[\sum_{m=1}^n\sum_{k=0}^i{(-1)^{i-k}\over (i-k)!}{k^m\over k!}\\ =\sum_{k=0}^i{(-1)^{i-k}\over (i-k)!}{1\over k!}{k^m-k\over k-1}\\ \]

然后通过一次卷积对所有 \(i\) 求出,于是答案式子可以 \(O(n\log^2 n)\) 求出。

https://codeforces.com/contest/1644/submission/147336448

[CF1641D] Two Arrays

不妨设所有数组按照 \(w\) 不降序排列,记 \(A_i=\{a_{i,j}\}_{j=1}^m,F_S=\{i|A_i\sub S\}\)。对于每个 \(i\),考虑找出一个比它大的最小的 \(A_i\cap A_j=\empty\)\(j\)。对于一个 \(k\),可以通过计算 \(\sum_{S\in A_i}(-1)^{|S|}|F_S\cap [i+1,k]|\) 是否大于 \(0\) 来判断 \(j\) 是否 \(\le k\)。而注意到对于 \(i\) 找出 \(j\) 后,对于 \(i+1\)\(j'\) 只用从 \(j\) 开始往前找才可能更新答案,所以这个过程可以用双指针做到 \(O(n2^m)\)

https://codeforces.com/contest/1641/submission/147527080

[CF1641E] Special Positions

对于每个 \(p_x\) 依次考虑,如果它被选入且在它左/有第一个被选入的为 \(p_l\)/\(p_r\)(如果没有则视为 \(-\infty\)/\(+\infty\)),那么对于 \(i\in [\lfloor(p_x+p_l-1)/2\rfloor,\lfloor(p_x+p_r)/2\rfloor]\),有 \(\min_{j\in T}|i-j|=|i-p_x|\),考虑用前缀和统一计算出这些 \(a_i\) 对答案的贡献。先考虑右边,发现 \(p_r\) 等于 \(p_{x+1},p_{x+2},\ldots,p_n,+\infty\) 的概率分别为 \(1/2,1/4,\ldots,1/2^{n-x},1/2^{n-x}\),于是可以分治 NTT 求出每个 \(p_x+p_r\) 的系数,然后扫一遍统计答案。左边同理,时间复杂度 \(O(n\log^2 n)\)

https://codeforces.com/contest/1641/submission/147530535

[CF1630F] Making It Bipartite

考虑建一张 DAG,其中 \((u,v)\) 有边当且仅当 \(a_u\mid a_v\),那么原图是二分图当且仅当新图不存在边数 \(>2\) 的链。考虑将该图复制一份然后对每个 \(u\) 添加有向边 \((u,u')\),那么这个图的反链就能对应一个原图的合法保留方案:当 \(u\)\(u'\) 在反链中就在原图上保留 \(u\)。而原图的合法方案也容易对应到一条反链。于是只用出复制后的图的最长反链即可,由于该图传递闭包后边数仍为 \(O(n\log n)\),所以可以直接转化为二分图最大匹配后做。

https://codeforces.com/contest/1630/submission/147560955

[CF1638F] Two Posters

\([L_i,R_i]\) 为包含位置 \(i\) 的,所有元素都 \(\ge h_i\) 的最长连续段的左右端点。记 \([l_i,r_i,x_i]\) 为第 \(i\) 张海报的左右端点和所占宽度。考虑对 \([l_1,r_1]\)\([l_2,r_2]\) 的位置关系进行分类讨论:如果它们不交或包含,那么调整可证存在最优解使得某一张海报是某个 \([L_iR_i,h_i]\),枚举这个 \(i\),再线性求一遍另一张海报的最大面积即可;否则,调整可证存在最优解使得它们的交为某个 \([L_i,R_i]\),可以枚举这个 \(i\),此时 \(x_1+x_2\) 需要 \(\le h_i\)。然后注意到一定存在某张海报的 \(x\) 为(或者同时为)某个 \(j<L_i\lor j>R_i\)\(a_j\),于是可以用双指针对于每个 \(j\) 求出两张海报往左右分别延申出的最长长度并以此更新答案。时间复杂度 \(O(n^2)\),略卡常,所以要对第一种情况换的常数更小的写法。

https://codeforces.com/contest/1638/submission/147554810

[Grand Prix of Suwon H] Hotspot-2

\(d_i=x_{i+1}-x_i\),那么要满足的条件就是 \(\forall i<n,r_i+r_{i+1}\le d_i\)。设 \(f_i(x)\) 表示满足 \(r_i\le x\)\(\forall i\le j<n,r_j+r_{j+1}\le d_j\)\(\sum_{i\le j\le n} r_j^2\) 的最大值。那么转移为 \(f_i(x)=\max_{y\le x,y\le d_i} (y^2+f_{i+1}(d_i-y))\),边界条件为 \(f_n(x)=x^2\),所求为 \(f_1(\infty)\)。转移时可设 \(g_i(y)=[y\le d_i](y^2+f_{i+1}(d_i-y))\) 然后对 \(g_i\) 做前缀 \(\max\) 得到 \(f_i\)。容易发现 \(f_i,g_i\) 均为分段函数,且每一段都是二次函数或常函数,可以直接维护每段。粗略分析每个 \(f_i\) 分的段数是 \(O(n)\) 的,于是总时间复杂度是 \(O(n^2)\) 的,但实测跑得飞快。有神仙能给个 hack 或更精细地分析下复杂度吗 /yiw

https://codeforces.com/gym/102979/submission/147626409

[CTSC2011] 字符串重排

建出给定串的字典树,并在每个串的末尾节点挂一个叶子表示这个串。那么所有最优序列一定是字典树的所有 dfs 序的叶子部分。考虑 \(u\) 必须恰好接在 \(v\) 后的限制,就相当于限制了 \(u\) 到 lca 路径上的每个点最后 dfs 到的儿子,以及 \(v\) 到 lca 路径上的每个点最先 dfs 到的儿子,以及 lca 的某两个儿子在 dfs 时先后顺序。注意到这个字典树缩掉只有一个儿子的点后深度是 \(O(\sqrt{\sum |S_i|})\) 的,于是可以暴力跳去满足限制和判断矛盾。

https://www.luogu.com.cn/record/70024912

[LOJ #6677] EntropyIncreaser 与菱形计数

发挥空间想象能力,这相当于一个 \(a\times b\) 的网格,每个格子上可以堆至多 \(c\) 个方块,并且每个格子的方块数量不能超过它左边和上面的格子的方块数量。直接转化为半标准杨表然后用公式算就好了,化简后可以 \(O(a+b+c)\) 计算。

https://loj.ac/s/1390692

posted @ 2022-03-01 21:28  Y25t  阅读(240)  评论(0编辑  收藏  举报