一些题(七)

[AGC014E] Blue and Red Tree

倒着考虑,最后删掉的蓝边和加上的红边连接的肯定是两个相同的点,然后可以把它们缩在一起继续做。这个过程可以用 map 启发式合并实现。

[CF1608E] The Cells on the Paper

发现三个矩形肯定形成平面划分最优,于是二分答案后枚举 36 种平面划分情况贪心判断即可。

https://codeforces.com/contest/1608/submission/138961887

[JOISC2020] 星座 3

记第 \(i\) 颗星星往左往右不碰大楼的区间为 \([l_i,r_i]\),那么 \(i,j\) 能形成星座当且仅当 \(x_i\in[l_j,r_j]\land x_j\in[l_i,r_i]\)。那么可以从下到上扫描线,记 \(f_i(g_i)\) 为当前只考虑 \(r\leq i(l\geq i)\) 的星星能保留的 \(c\) 的最大值。那么加入 \((c,x,l,r)\) 时用 \(f_{x-1}+g_{x+1}-g_{r+1}+c\) 更新 \(f_{[r,n]}\)(注意所有 \([l,r]\) 要么不交要么包含),\(g\) 同理。于是这个过程可以用线段树维护。

[JOISC2020] 収穫

对于每个 \(i\),让它向 \(a_i+c\) 之后第一个 \(a_j\)\(j\) 连边,代表 \(i\) 收到果子后下一个收到这个果子的人为 \(j\),这样会形成若干棵内向基环树。那么对于每棵果树,只需要考虑第一个摘到它的人是谁以及什么时候,然后这个果子就会沿着基环树走。

考虑如何回答询问 \((u,T)\),如果 \(u\) 不在环上,那么答案就为在 \(T\) 之前能从子树内送上来的果子数,可以转成二维数点。如果 \(u\) 在环上,设该环长为 \(l\) ,该基环树上每个果子第一次到达 \(u\) 的时间为 \(\{t_i\}\),那么答案为 \(\sum_i\lfloor(T-t_i)/l\rfloor=(\sum_i(T-t_i)-\sum_i((T-t_i)\bmod l))/l\)。于是前一部分可以预处理 \(\sum_it_i\)。对于后一部分,可以对该环找一个关键点 \(u'\),然后将询问转移到 \(u'\) 上,为 \(T+dis(u,u')\),预处理出对于 \(u'\)\(\{t'_i\}\bmod l\) 的位置即可回答。

[AGC024F] Simple Subsequence Problem

\(S\) 中的每个串都能建出一个子序列自动机,要求的就是最长的、字典序最小的串使得至少有 \(k\) 个自动机能匹配上。考虑把匹配的过程记录进状态里,记能达到如下状态的自动机个数为 \(f_{x,y}\):当前已匹配完的串为 \(x\),剩余待匹配的串为 \(y\)。由于 \(|x|+|y|\leq n\),故总状态数为 \(O(n2^n)\)。转移时枚举 \(x\) 后面接一个 0 或 1 或直接终止匹配。边界条件为 \(f_{\varepsilon,S_i}=1\),所求为最长的、字典序最小的、满足 \(f_{T,\varepsilon}\geq k\) 的串 \(T\)

https://atcoder.jp/contests/agc024/submissions/26711962

[JOISC2020] 最古の遺跡 3

倒着考虑,一个柱子会一直被震直到变没或者它后面没有相同高度的柱子。于是可以记当前会被震没的最高高度为 \(i\) (也就是说 \(1,\ldots,i\) 都在后面出现过)的方案数为 \(f_i\)。那么若当前位被震没,转移就是 \(f_i\gets(2i-(i+c_0))f_i\),其中 \(c_0\) 为已经被震没的位置数。否则,若它震完之后高于 \(i+1\) 就先不管。不然枚举 \(k\) 表示它被震到了 \(i+1\) 并且连上了 \(i+1,\ldots,i+k\) 的高度,转移到 \(f_{i+k}\),系数为 \({c_1-i\choose k-1}g_{k-1}(2k-(k-1))\),表示先在后面选定 \((k-1)\) 个位置,然后让它们震成 \(i+2,\ldots i+k\),最后给当前位选一个。其中 \(c_1\) 表示已经被保留的位置数,\(g_n\) 表示将 \(1,\ldots,n\) 各两个填入 \(n\) 个空中使得震完后剩下 \(1,\ldots,n\) 各一个。\(g\) 可以通过枚举第一位震成的高度来得到递推式 \(g_n=\sum_{i=1}^n{n-1\choose i-1}(2(n-i+1)-(n-i))g_{i-1}g_{n-i}\),从而 \(O(n^2)\) 求出 \(g\),最终 \(O(n^3)\) 得到 \(f\)

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

[集训队作业2018] 串串

考虑先算出拼出子串的回文串有序对 \((A,B)\) 数。对于每个回文子串 \(B\),若它的出现左端点位置为 \(i_1,\ldots i_k\),那么它对应的 \(A\) 的数量就是 \(i_1-1,\ldots,i_k-1\) 对应在回文树上节点到根路径的并的非根节点数。这个可以在反串回文树上 set 启发式合并求出。然后考虑那些串会被由多种方式拼成,发现若 \(A\) 是一个回文串,那么 \(A^k\) 会被计算 \(k-1\) 次;若 \(A\) 是个双回文串,那么 \(A^k\) 会被计算 \(k\) 次;而其他情况的拆分方式均唯一。于是可以用 runs 找出每个循环两次以上的串,然后判断它是否是回文串或双回文串。由于一个双回文串一定存在一种回文拆分 \(AB\) 使得 \(A\) 为最长回文前缀或 \(B\) 为最长回文后缀,证明可以考虑反证,那么对于后者就可以用回文树 \(O(\log n)\) 判断。

https://uoj.ac/submission/520931

[CF1603F] October 18, 2017

如果 \(x=0\),那么这 \(n\) 个数必须线性无关,考虑依次确定每一个,方案数为 \(\prod_{i=1}^n(2^k-2^{i-1})\)。否则容易发现答案于 \(x\) 无关。考虑枚举这些数张成线性空间的维数,设为 \(r\)。假设顺着扫过去找到的线性基为 \(b_1,\ldots,b_r\),那么它们不包含 \(x\) 的方案数为 \(\prod_{i=1}^n(2^k-2^i)\)。接着考虑剩下的数,发现塞在 \(b_i\)\(b_{i+1}\) 之间的数要能被前 \(i\) 个基线性表出,方案数为 \(2^i\),那么这部分的方案为 \([x^{n-r}]\prod_{i=1}^r{1\over1-2^ix}={\mathbf{n}\choose\mathbf{n-r}}_2\)。于是总答案为 \(\sum_{r=0}^k{\mathbf{n}\choose\mathbf{n-r}}_2\prod_{i=1}^n(2^k-2^i)\),可以递归一些东西然后 \(O(k)\) 求出。

[CF1601E] Phys Ed Online

对于 \([l,r]\) 的答案为 \(\sum_{l+kt\leq r}\min_{l\leq i\leq l+kt}c_i\)\(\bmod t\) 之后就是区间前缀 \(\min\) 之和,从后往前单调栈随便做。

[CF1603D] Artistic Partition

对于 \(2^k>n\),可以取每个 \(r<2l\) 使得答案取到下界 \(n\)。于是只用考虑 \(k\)\(O(\log n)\) 级别的情况。容易发现 \(c\) 满足四边形不等式,有决策单调性。那么只用考虑快速地求出 \(c(l,r)\),枚举 \(\gcd\) 可以发现答案就是 \(\sum_{k=l}^r\sum_{i=1}^{\lfloor r/k\rfloor}\varphi(i)\),于是可以预处理 \(\varphi\) 的前缀和然后整除分块 \(O(\sqrt{r-l})\) 做。

[CF1423C] Dušan's Railway

将树自底向上贪心分块,使每个块大小恰好超过 \(O(\sqrt{n})\)。然后每个块根向自己所在块和父亲所在块连边,两两块根之间连边,这样块根到其它点以及不同块的两点之间距离都 \(\leq 3\)。那么可以删掉块根然后递归,这样只会递归 \(O(\log\log n)\) 层,总复杂度 \(O(n\log\log n)\),常数不超过 \(2.5\)

[CF1423N] BubbleSquare Tokens

首先将每条边上放一个硬币,然后增量构造。假设当前考虑的点为 \(u\),它向已考虑过的点连了 \(d\) 条边。于是对于每一条边 \((u,v)\),可以将这条边上的硬币移到 \(v\),或将 \(v\) 上的硬币移到边,这样只会使 \(u\) 的权值 \(+1\)\(-1\)。由于 \(u\) 本身可以放一个硬币,所以 \(u\) 的权值有 \(d+1\) 种可能,而至多 \(d\) 种可能被不合法,于是一定存在合法的方案。

https://codeforces.com/contest/1423/submission/118808214

posted @ 2021-12-22 08:27  Y25t  阅读(133)  评论(0编辑  收藏  举报