11月杂题

1.10.30D/qoj6794 Sequence to Sequence

先观察到我们一定是先减后加。因为对于一个数 +1 -1 一定不会改变,但 -1 +1 就会有改变。那对于相邻的 +1 -1 操作,如果不交就直接交换;否则把相交的部分直接删掉,那要么删成两个 +1 ,要么成两个 -1 ,要么是不交的 +1 -1 。

如果我们指定一个数减的次数 \(d_i\) ,那加的次数就是 \(g_i=d_i+t_i-s_i\) 。然后操作次数就是 \(\sum \max(0,d_i-d_{i-1})+\max(0,g_i-g_{i-1})\) 。但是这个没有考虑 \(t_i=0\) 的情况,考虑一个极长的 \(t_i=0\) 连续段 $[l,r] $ 中 \(s_i\) 的最大值为 \(m\) ,若 \(m<\max(d_{l-1},d_{r+1})\) ,则费用还要加上 \(\max(d_{l-1},d_{r+1})-m\)

我们就能由此设计一个简单 dp 计算答案,即记下来末尾的 \(d_i\) ,复杂度 \(O(nV^2)\) 。考虑优化,猜测这个 dp 数组是凸的;进一步发现,它能分成三段,一段斜率为 \(0\) ,一段斜率为 \(1\) ,一段斜率为 \(2\) 。于是维护折点即可,复杂度 \(O(n)\)

具体转移:https://drops.dagstuhl.de/opus/volltexte/2016/6078/pdf/LIPIcs-CPM-2016-16.pdf

2.10.26D

算矩形个数可以算多少个 \(2*2\) 小方格里黑格子个数为 \(1\)\(3\)

3.10.26B/P3776 [APIO2017] 斑斓之地

平面图联通块计算:\(C=V-E+F-1\) 。算 \(V\) 和算 \(E\) 都是容易的,而对于 \(F\) ,我们只需统计 \(2*2\) 小方格全黑的位置个数即可,因为这两个题都保证空腔的个数 \(\le 1\) 。剩下的就都好做了。

4.互测 1A

还是不会。差距。

5.topcoder13460 FrozenStandings

就是 AGC061C ,为啥看了半天才看出来?

6.P9257 [PA 2022] Mędrcy

先来翻译一下题意,对一个咒语我们连边 \((u,v)\) ,那我们考虑贤者 \(x\) 是怎么思考的:就是他一开始只知道不与他相连的边,设 \(f(G)\)\(G\) 这个图第一次有人紫砂的天数,那如果到 \(f(G-\{x\})+1\) 天还没有人紫砂,就说明存在 \(x\) 不知道的边,\(x\) 就紫砂了。所以 \(f(G)=1+\min\limits_{x\in V} f(G-\{x\})\) 。特别的,对于 \(E=\emptyset\) 的图我们有 \(f(G)=0\) 来满足定义。

再看看上面的定义,发现就是删去最少的点使剩下的子图是独立集。考虑进行搜索,找到度数最大的点 \(x\) 并枚举我们是否要删去它。如果不删 \(x\) ,与它相邻的点都要被删。注意到 \(d_x\le 2\) 时我们能直接计算出答案,不需要再搜索。这个题就做完了。原因是,设 \(f(k)\) 是对答案限制为 \(k\) 的图至多要递归的次数,我们有 \(f(k)=f(k-1)+f(k-3)\) ,而 \(f(30)\) 大概是 \(10^5\) 级别的。

7.CodeChef Find a special connected block

如果颜色数少就是斯坦纳树。

神来之笔:考虑把这些颜色随机划分,即对每个颜色赋一个 \([0,k)\) 的权值,把这个权值当成新的颜色来跑。如果每个集合都有至少一个最优解中出现的颜色,那就 win 了。

考虑这样算一次正确的概率,就是 \(\frac{k^k}{k!}\) 的, \(k=7\) 时大概是 \(\frac{1}{164}\) 。这个题就做完了。

8. CF1089H Harder Satisfiability

先建出 2-SAT 的图,对每个限制 \(a\or b\) ,连边 \(!a\rightarrow b\)\(!b \rightarrow a\) ,如果这个时候有矛盾就直接 G 了。

然后考虑讨论 \(x_n\) 的符号和与它相关的限制,然后将式子递归到只剩 \(n-1\) 个数。如果 \(x_n\) 前面的符号是 \(\forall\) ,那考虑与之相关的限制,你发现对于 \(i<n\)\(x_i\) 的值直接被指定了。否则的话就无所谓啊。通过 \(i-n,j-n\) 得到的 \(i-j\) 限制已经通过 2-SAT 的图处理出了,所以直接递归下去就行了。

总结一下上面的过程。就是如果存在一个 \(a\rightarrow b\) 的限制 \((a<b)\)\(b\) 符号是 \(\forall\) ,我们就能得到 \(x_a\) 的值。如果 \(a\) 符号也是 \(\forall\) 就直接无解了,体现在 2-SAT 图上,就是 \(a,!a\)\(b,!b\) 两两不可达。否则,你发现把上面两个条件判掉后,对一个 \(a\) 只存在至多一个这样的 \(b\) 。那我们看 \(a\) 是否和 \(b\)\(!b\) 在一个 SCC 即可。就做完了。

9.互测 2A

自个做出来的捏。考虑值域是纸老虎,算出 \(dp_{i,j}\) 为:长度为 \(i\)\(j\) 个不同的数的本质不同序列个数,最后计算 \(\sum\tbinom{m}{i}dp_{n,i}\) 即可。考虑转移,就是枚举最大值位置,有多个最大值就钦定是第一个最大值。考虑左边有 \(a\) 个本质不同的数,右边有 \(b\) 个不同的数,然后把这三个部分拼起来,为了满足题目限制,只有两个地方可能拼起来,即:左 max 与右 min ,右 max 与 max 。这个就做完了。

10.互测 3A

自个做出来的捏(!!!)。

考虑二项式反演,钦定一些位置有 \(p_x<p_{x+1},p_y^{-1}<p_{y+1}^{-1}\) 。考虑此时填排列的方案数怎么算,现在 \(p\)\(p^{-1}\) 都形成了一些链,考虑 \(p\) 中第 \(i\) 条长度为 \(x_i\)\(p^{-1}\) 中第 \(j\) 条长度为 \(y_j\) ,那方案其实就是构造矩阵 \(A\) 使得行和为 \(x\) ,列和为 \(y\) 的方案数。这是不可做的,但你考虑每个满足:一个前缀行和 \(>0\) 且一个前缀列和 \(>0\) 的矩阵都唯一对应了一个 \(p,p^{-1}\) 的钦定方式。

\(f_{i,j}\) 表示 \(i\)\(j\) 列这样的矩阵个数。则 \(g_{i,j}=f_{n-i,n-j}\) 表示 \(p\) 中钦定 \(i\) 个位置,\(p^{-1}\) 中钦定 \(j\) 个位置的总方案数。有 \(ans_{i,j}=\sum\tbinom{i_2}{i}(-1)^{i_2-i}\sum\tbinom{j_2}{j}(-1)^{j_2-j}g_{i,j}\) 。这是二维卷积,可以直接 \(O(n^3)\)

然后考虑 \(f_{i,j}\) 的计算,直接容斥:\(f_{i,j}=\sum\tbinom{i}{i_2}(-1)^{i-i_2}\sum\tbinom{j}{j_2}(-1)^{j-j_2}\tbinom{(i-i_2)(j-j_2)+n-1}{n-1}\) 。还是二维卷积,可以直接 \(O(n^3)\)

11.互测 3B

维护点 kruskal 重构树,每次连边 \((x,y)\) 要做的是,令路径上最大点为 \(a\) ,我们把 \(x\)\(a\)\(y\)\(a\) 归并起来。令 \(x<y\) ,我们找到 \(x-a\) 中最大的 \(\le y\) 的数 \(e\),割掉 \((e,fa_e)\) ,连边 \((e,y)\) ,再递归做下去。

这是容易用 LCT 维护的。然后可以证明, 这样总操作次数不超过 \(O(n\log n)\) ,所以复杂度为 \(O(n\log^2n)\)

12.互测 3C

首先你要发现 \(f\) 是能线性递推的,因为 \(f_n\) 可以写成 \(a^TA_m^nb\) 的形式,我们求 \(A_m\) 的特征多项式 \(|xI-A_m|\) 即可,通过讨论 \(m\) 所在环是 \(\{m-1,m\}\) 还是 \(\{m\}\) ,可以求出 \(F_m(x)=(x+2p-1)F_{m-1}(x)-p^2F_{m-2}(x)\) 。只要求出 \(f_0\)\(f_{m-1}\) ,即可利用某 B 开头算法得到答案。

通过反射容斥可以得到一个 \(f_i=\sum\limits_{j}c_j[x^j](\frac{p}{x}+(1-2p)+px)^i\) 的形式。转置一下,变成计算 \(\sum d_i(\frac{p}{x}+(1-2p)+px)^i\) ,分治 NTT 即可,复杂度 \(O(n\log^2n)\)

13.CF1895G Two Characters, Two Colors

维护 dp 数组的差分数组,假装它是上凸的,然后就有两种操作,一种是前缀减 \(1\) ,一种是插入 \(a\) 。你发现第一种操作会导致不是上凸的了。但你考虑此时凹的地方,比如 \(dp_i=a,dp_{i+1}=a+b,dp_{i+2}=a+2b+1\) 。那直接把 \(dp_{i+1}\) 改成 \(a+b+1\) 是不影响答案的,证明就是看 \(dp_i-ix\) 是怎么取到的最大的。

于是我们在减 \(1\) 时,把分界点左边的一段 \(X\) 和右边的一段 \(X+1\) 交换即可。

14.CF1895F Fancy Arrays

考虑确定了 \(a_i-a_{i-1}\) 后的最低点,那如果 \(x=0\) ,最低点在 \([0,k-1]\) 就是合法的。总方案数即 \(k(2k-1)^{n-1}\)\(x>0\) 时,最低点在 \([0,x+k-1]\) 在大多数时候都合法,除了全部 \(<x\) 的情况,原因是,若只有 \(<x\) 的数和 \(\geq x+k\) ,那肯定有一处差 \(>x\) 。就做完了。

15.gym102341B Bulbasaur

考虑最大流转最小割,转化为:删掉最小的点使两端不连通。

考虑已知了两端 \(l,r\) 该怎么做,就是 \(dp_{s,i}\) 表示考虑到第 \(i\) 层,当前与左端连通的点集是 \(S\) 需要删的最小点数。现在需要计算所有子段的权值和,考虑枚举 \(r\) ,同时我们发现上面的 dp 费用一定 \(\le k\) ,且随着层数的增加费用会越来越小。

\(k\) 非常小,于是交换一下值域和状态,设 \(dp_{s,c}\) 表示至多 \(c\) 次删点能使 \(r\) 层的状态是 \(s\) 的最大 \(l\) 。这样就做完了,复杂度 \(O(n2^kk^2)\)

16.gym102900F Fountains

把每个区间 \([l,r]\)\(C(l,r)\) 从大往小排序,则每次加入一个区间,相当于把 \(1\le x\le l,r\le y\le n\) 的区间 \([x,y]\) 染成黑色,如果一个格子从白变黑了,就把权值加上 \(C(l,r)\)

于是有一个 \(dp_{S,i,j}\) 表示当前染色的状态为 \(S\) ,考虑到了第 \(i\) 个区间,选了 \(j\) 个区间的最大权值。

我们把 \([x,y]\) 看成一个格点 \((x,y)\) ,发现黑白之间的分界线就是一个从左下往右上的路径,每次只能向上/向右。所以可能的 \(S\) 个数不超过 \(4^n\)

17.CF1292F Nora's Toy Boxes

考虑如果 \(a_i|a_j\) 就从 \(i\)\(j\) 连一条边,然后考虑每个弱联通块。首先入度为 \(0\) 的点肯定不会被删掉,而且对于每次操作 \((i,j,k)\) ,如果 \(i\) 入度不为 \(0\) ,我们可以调整为入度为 \(0\) 的。

除了入度为 \(0\) 的点,剩下的点中至少会剩一个。我们说明可以取到这个下界:考虑倒着来加点,如果有一个入度为 \(0\) 的点能到达某个新加的点,我们称它被激活了。设当前激活的集合是 \(S\) ,新加的点 \(x\) 能激活的点集合为 \(P_x\) ,则 \(S\cap P_x\) 非空。我们每次一定能找到这样的 \(x\) ,否则图就不是弱连通的了。

现在考虑计数,其实直接按上面的过程来做就行了。而入度为 \(0\) 的个数是 \(\le 15\) 的,原因是:若存在一个点 \(>30\) ,那它一定是孤立点,不用管;否则考虑把 \(1\)\(30\) 表示成 \(a2^b\) 的形式 (\(a\) 是奇数) ,\(a\) 相同的数显然不能同时取。不同的 \(a\) 只有 \(15\) 个。

18. TopCoder 13792 Brainstuck

你发现每走出一个括号当前数就要清零。考虑当前数是 \(x\neq 0\) ,进入一对括号会发生什么。case1:这个括号内还有括号,那我们必须要走完一轮后 \(x=0\) ,否则 \(x\) 永远都不会为 \(0\) 。case2:没有括号,就是看这个部分的增量 \(k\) 是否满足 \(-\frac{x}{k}>1\)

于是记 \(f_{i,j}\) 表示当前 \(x=j\) ,走完一遍后 \(x=0\) 的方案数。转移是容易的。最后要算合法串个数,就是考虑计算 \(g_j\) 是长度为 \(j\) 且末尾是右括号的方案数,这个可以结合 \(f\) 容斥算出,最后统计 \(\sum g_i2^{n-i}\) 即可。

19.UR26 B

20.UR26 C

21.互测 5B

就是分类讨论,傻逼题。

22.互测 5A

前面的步骤都很唐,但是最后一步卡常很妙。就是每个节点要维护 \(O(\log V)\) 个大小为 \(O(\log len)\) 个二进制数,这是不优的,考虑车一转,变成维护 \(O(\log len)\) 个 unsigned long long 。这样建树复杂度就从 \(O(n\log V)\) 变成 \(T(n)=2T(\frac{n}{2})+\log n=O(n)\) 的了。

23. gym101190C Cactus Construction

考虑建出圆方树。现在对于 \(x\) ,我们依次处理它的方儿子 \(o\) 。遍历 \(o\) 的儿子 \(v\) ,先递归构造 \(v\) 子树,要求它最后形如:\(c_v=1\) ,其它点都等于 \(4\) ,且子树内的边已经连完。

然后考虑,如果 \(o\) 代表的点双是一条边,那把 \(v\) 染成 \(2\) ,合并 \((x,v)\) ,连 \((1,2)\) ,再把 \(v\) 染成 \(4\) 即可。

如果是一个环,那依次连环上的边。设第一个点是 \(v_0\) ,则先染 \(v_0\)\(2\) ,合并,连 \((1,2)\) ,然后顺次加入后面的点 \(v\),如果上一个点颜色为 \(c\) ,则染 \(v\)\(5-c\) ,合并,连 \((2,3)\) ,再染 \(c\)\(4\) 。另则同理。再对环上最后一个点,如果颜色为 \(c\) ,就连 \((1,c)\) 并染 \(c\)\(4\)

这样就完成了构造。

24. gym102059B Dev, Please Add This!

考虑每行/每列上的一些极长的空地,如果我们某个时刻停在其中一端,则我们能通过往返操作吃完上面的星星。所以考虑对把每个连续段建成点,然后对于一个横段,往外连两条边表示它两端的格子对应的竖段。则现在我们要从一个固定的起点出发,在这个图上游走。考虑每个星星能被吃到,当且仅当包含它的竖/横段中有至少一个走到了。

于是尝试 2-SAT 解决,设 \(x_u\) 表示一个点是否被走到,则一个星星对应了 \(x_u=1\)\(x_v=1\) 的限制;而不能从起点走到的点一定有 \(x_u=0\) ;如果 \(u,v\) 互不能走到 ,那 \(x_u=0\)\(x_v=0\) 。而现在我们说明,如果这个 2-SAT 有解,那原题也有解。首先这肯定是必要的;其次,考虑此时所有 \(x_u=1\) 的点,对它们建立一张新图,如果 \(a\) 在原图上能到达 \(b\) 就连一条 \(a\rightarrow b\) 的边,把 SCC 缩起来后就形成了一张竞赛图,然后要从一个固定的起点出发(且这个起点入度为 \(0\))走哈密顿路。

这是一定有解的:首先能去掉原来的起点,变成选择一个起点出发。然后考虑归纳构造:先构造出 \(n-1\) 个点时的哈密顿路,然后加入点 \(n\) 。不妨设 \(n-1\) 时造出的路径形如 \(1\rightarrow 2\rightarrow3\dots \rightarrow n-1\) ,设当前边方向为 \(i \rightarrow n\)\(x_i=0\) ,否则 \(x_i=1\) 。如果我们能找到 \(x_i=0,x_{i+1}=1\) ,或者 \(x_1=1\) 或者 \(x_{n-1}=0\) 就能插入 \(n\) 。如果此时不能插入 \(n\) ,那 \(x_1=0\) 。由于找不到 \(x_i=0,x_{i+1}=1\) ,那其余点 \(x_i\) 皆为 \(0\) 。但又有 \(x_{n-1}=1\) ,矛盾!

于是我们证明了这个结论。

25.P9194 [USACO23OPEN] Triples of Cows P

模拟赛的时候一直在想咋直接维护 \(\sum \tbinom{ru_i}{2}\) ,从而卡死了。就,这个题需要一些转化。搞一个新图,我们新建 \(n-1\) 个点,每个新点代表一条边,连接它的两个端点,然后每次删除点 \(u\) 相当于让当前与 \(u\) 相连的新点合并,并删掉 \(u\) ,此时两个点 \(u,v\) 有边,当且仅当它们中间隔了恰好一个新点。不妨以 \(n\) 为根,每次删除就可以当做是:把 \(u\) 的所有儿子合并进 \(u\) 的父亲。统计答案就是分类讨论,维护维护捏。

26.gym104128L Proposition Composition

最难的是选两个树边的情况,如果覆盖它们的非树边集合相等就能统计进答案。考虑链表维护每个等价类,并用线段树维护 pre 和 nxt ,使得每次能快速找到要断掉的位置。而现在我们要求出新的两个等价类,启发式分裂即可,具体的,用链表暴力扫一遍中间这段,如果大小 \(>\frac{S}{2}\) 了就直接结束,并把两端连起来得到的集合分出去;否则就把中间这段分出去。

27. CF1416E Split

考虑 dp ,求出 \(dp_{x,p}\) 表示考虑到了 \(b_x\)\(a_{2x}=p\)\([a_{i}=a_{i+1}]\) 的位置最多有多少。考虑优化,发现我们只需要记下哪些 \(p\) 取到了最大值,因为添加 \(x+1\) 时,不同的 \(p\) 只会使贡献增加 \(1\) 。 维护这些 p ,写出转移式子后发现只有三种操作:保留 \([l,r]\) 的数;添加一个区间;\(x\rightarrow b-x\) 。用 set 维护所有可能的 \(p\) 的区间并记录下现在的实际值是 \(kx+b\) 即可。

28. ucup 2-8 A

29.CF1835D Doctor's Brown Hypothesis

来写一写这个经典问题吧。首先能对每个 SCC 单独求。

然后,在模 \(p\) 意义下若有一条从 \(u\)\(v\) 的长度为 \(w\) 的路径,则一定存在一条 \(v\)\(u\) 的长度为 \(-w\) 的路径,原因是我们任取一条从 \(v\)\(u\) 的路径,从 \(v\) 出发绕 \(p-1\) 圈再走向 \(u\) 即可。

现在考虑求出所有环长的 gcd 为 \(d\) ,考虑 \(p|d\) 的充要条件:每对 \(u,v\) 之间的路径长度在模意义下是唯一的,因为两条长度为 \(a,b\) 的路径一定会得到一个 \(a-b\) 的环。

所以取一个 dfs 树求出深度 \(dis_u\) ,有 \(d=\gcd dis_v-dis_u-w\) 。然后在模 \(d\) 意义下,\(u\)\(v\) 模意义下为 \(k\) 的路径,等价于 \(dis_u+k=dis_v\) 。这样就做完了。

30.互测 7A

场切喵。对每个值 \(x\) 分别考虑,看能有多少次 skip 掉 x 。把 \(<x\) 的看成 \(0\) ,\(>x\) 的看成 \(2\)\(=x\) 的看成 \(1\) 。找出第一个 \(2\) ,则在它前面的 \(1\) 才是有效的。但还有可能,这些 \(1\) 会被拿去填 \(2\) 后面的 \(0\) 。现在需要算每个区间的答案。还是像上面一样处理,把右边第一个 \(2\) 相同的 \(1\) 一起考虑:对于从右往左第 \(i\)\(1\)\(X\) ,找到 \(2\) 右边第 \(i\)\(0\) 的位置 \(Y\) ,再设它左边第一个 \(2\) 位置在 \(P\) 。则我需要 \(P<l\le X\le r<Y\) ,这个 \(X\) 才会起贡献。二维数点即可。

31.互测 7B

好牛逼啊。首先“每个集合非空”可以用容斥解决,我们算出 \(g_i\) 表示使用 \(i\) 种颜色染色,使相同颜色的点距离 \(\geq k\) 的方案,然后一遍卷积即可得到原答案。

接下来考虑链的情况,从左往右依次染色,注意到染 \(u\) 时若存在两个前面的点满足 \(dis(u,v_1)<k,dis(u,v_2)<k\) ,显然有 \(dis(v_1,v_2)<k\) ,于是直接统计 \(c_u\) 表示前面的点中满足 \(dis(u,v)<k\) 的个数,则 \(g_m=\prod \max(0,m-c_i)\) ,多点求值即可。

再考虑树,发现按 dep 从小往大染色即可得到相同的结论!点分治计算 \(c\) 即可。多点求值和 点分治+BIT 都是 \(O(n\log^2 n)\) 的。

32.互测 8A

考虑 \(\prod \frac{a_i}{s_i}\) 这个式子的组合意义:有 \(a_i\) 个颜色为 \(i\) 的球,然后要任意排列使得:取出每种颜色的最后一个球,这些球颜色依次为 \(1,2,\dots,n\) 的概率。 \(k=1\) 时,考虑确定 \(a\) 中包含的数后,每种对球的排列都对应着一个对 \(a\) 排的顺序。于是它们的权值和即为 \(\frac{1}{\prod a_i}\)

\(k=2\) 时,固定 \(a_1\) 后就是计算:任意排列后,颜色 \(1\) 的最后一个球在最前面。考虑容斥,钦定 \(2,\dots,n\) 中哪些打过了 \(1\) ,于是我们能得到式子:\(\sum\limits_{S} (-1)^{|S|}\frac{a_1}{a_1+\sum\limits_{i\in S} a_i}\)

对着这个式子 dp 即可,我们记录下当前考虑到了哪个权值;有没有指定 \(a_1\)\(S\) 中数的和,即可算出答案。复杂度 \(O(n^4)\)

33.ARC168F Up-Down Queries

太妙了。类似于 slope-trick,我们维护一个集合,内含 \(y_i-y_{i-1}\)\(i\) 。则每次操作相当于加入两个 \(a_i\) 然后弹掉最小值。

而这个可以转化成费用流问题:\(i\rightarrow i+1\) 有流量无限,费用 \(0\) 的边;\(S\rightarrow i\) 有流量 \(2\) ,费用 \(a_i\) 的边;\(i\rightarrow T\) 有流量 \(1\) ,费用 \(0\) 的边。

就是人员调度链版本,我可太熟这个了。

35.CF1896F Bracket Xoring

先观察一下无解的情况:\(a_1\ne a_{2n}\) 一定无解,因为每次操作都会反转 \(a_1,a_{2n}\)\(\sum a_i\) 是奇数,因为 \([i,p_i]\) 长度为偶。

然后思考一些基础操作:不关心 \(a_1,a_{2n}\) ,因为能通过一遍 \((()()\dots())\) 反过来;

把一些 \((()()()\dots())\) 的串拼起来,发现可以使一些 \(a_{2i},a_{2i+1}\) 同时变化。那只要初始 \(a_{2i}=a_{2i+1}\) 即可。

考虑一开始在外面套一个括号;对于中间的,如果 \(a_i=a_{2i+1}\) 就填 \(()\) ,否则根据情况填 \(((\)\())\) ,这样就能调整成需要的形式了。

36.CF1896G Pepe Racing

我咋感觉这个比 F 自然呢。就是把 \(n^2\) 个人分成 \(n\) 组,每组选出来一个快车,再比较这些快车即可得到最快的车。

把这个车删掉后考虑调整分组,就是从其他组的末尾抽出来一些车,凑够 \(n\) 辆后拼成新的一组。这样做下去,一直到只剩 \(2n-1\) 辆车。

这个时候换一种方法。注意到此时不在开头的车都是废的,因为在开头的车都通过前面的操作证明自己是好的了,而废车有 \(n-1\) 辆。

所以每次在剩下的好车里直接找最大的即可,查询时塞进来一些废车就行了。

37.CF1896H Cyclic Hamming

感觉是自己 yy 出来的啊。

先转化一下题意,令 \(F(x)=\sum s_ix^{2^{k+1}-1-i},G(x)=\sum t_ix^i\) ,则我们需要 \(FG+(O-F)(O-G)=2^nO\) ,其中 \(O(x)=\sum\limits_{i=0}^{2^{n+1}-1} x^i\)

(其实这里是要 \(\bmod x^{2^{n+1}}\) 的,但懒得写了)

化简一下可以得到 \(FG=2^{n-1}O\) 。注意到 \(DFT(2^{n-1}O)=2^{2n}\) ,而 \(DFT(F),DFT(G)\) 的常数项都是 \(2^n\)

于是我们只关心 \(DFT(F),DFT(G)\) 有哪些项是为 \(0\) 的。事实上因为只需观察是否非 \(0\) ,我们看 \(2^1,2^2,\dots,2^n\) 处是否为 \(0\) 就好了。

对于 \(2^i\) 处,即 \(\sum W_{2^{n+1-i}}^{j}f_j\) 是否为 \(0\) 。令 \(P=2^{n+1-i}\)

考察对于 \(0\le j<2^P\) ,哪些 \(W_P^j\) 是能合并的。发现只有 \(u\)\(u+2^j\) 能合并。原因是你考虑 \(\sqrt{2^n-2^x}\)\(\sqrt{2^n-2^y}(x,y<n)\) 能不能合并。是不能的。

这样就分析的差不多了。其实就是令 \(f'_{rev(i)}=f_i\) 后,\([2^{i+1}k,2^{i+1}k+2^i)\)\(1\) 个数与 \([2^{i+1}k+2^i,2^{i+1}(k+1))\) 相同。

考虑对 \(f\) 求出 \(c_S\) 表示:\(i\in S\) 都要满足上述条件,填 \(t'\) 的方案数。\(g\) 类似的求,然后 FMT 即可计算答案。

接下来思考怎么算 \(c\) 。考虑把它这个序列建成一棵树,然后令 \(dp_{x,i,S}\) 为:\(x\) 子树内选了 \(i\)\(0\) ,其中深度在 \(S\) 内的点都要满足:左右儿子的 \(1\) 个数相同。

有以下代码:

for(int o=1;o<N;o<<=1){
		for(int i=0;i<N;i+=(o<<1))for(int j=0;j<o;j++){
			vi x=g[i+j],y=g[i+j+o];
			g[i+j]=x*y,g[i+j+o]=x|y;
		}
	}

其中 \(|\) 是点乘。复杂度是 \(O(3^nn)\) 的。

38. 互测 4A/CF132F

转化一下题意,设 \(p_x\) 是最大的 \(y\) 满足 \(y<x,a_x=a_y\) ,那就可以转化成:可以逃避 \(w_x\) 的费用,但会导致 \(a_{p_x+1}\)\(a_{x-1}\) 都加 \(1\) ,要求最后 \(a_i<m\)

考虑从 \(x\)\(x+1\) 连流量为 \(m-1\) 的边, 从 \(x\)\(p_x+1\) 连一条费用为 \(-w_x\) ,流量为 \(1\) 的边,跑最小费用可行流即可,因为每选一条额外边就会使中间边调整。

39.互测 10A

好题。考虑确定每个叶子的深度后如何计算答案。此时重量带来的影响就固定了。

我们从下往上处理,则需要分析怎么对当前层的 \(2x\) 个点合并。每个点都有一个信息表示它的子树的高度。

由于费用是所有轻链的 \(2^|S|\) 之和,我们有策略:按高度从大往小排序后,第 \(2i\) 大和第 \(2i+1\) 大合并。(从 \(0\) 开始编号)

变成 \(x\) 个点后会加入 \(y\) 个叶子,发现这些叶子所在链的高度都能计算出来了,原因是再之后加入的叶子高度一定比它小,此时第 \(i\) 个叶子就是第 \(x+i-1\) 大的,每往上一层就会除以 \(2\) ,变成奇数了就会被毙掉。那这个链最后的权值就是 \(lowbit(x+i-1)\)

由此 dp 即可,记 \(dp_{i,j}\) 表示取了 \(i\) 个叶子,当前层有 \(j\) 个点的最小费用,每次要么在当前层再加入一个叶子,要么合并成 \(\frac{j}{2}\) 个点并往上传。

复杂度 \(O(n^2)\)

40.互测 11B

考虑单位根反演,整理一下式子可以得到 \(\prod \frac{1}{x_i^{c_i}}\prod\limits_{1<u<v\le n}\frac{1+x_ux_v}{2}\) ,其中 \(x_i\)\(w_4^0\)\(w_4^3\) 间取。

注意到取两个 \(w_4^1\) 或 两个 \(w_4^3\) 就寄了,同时取 \(w_4^0\)\(w_4^2\) 也寄了,所以情况就很少了答案很好算。

难点在于想到要单位根反演捏。

41.互测 12C

所求即 \(\prod\limits_{i=1}^n ((x^2+2x+1)y^{a_i}+1)\) ,其中 \(y\) 做的是异或卷积,FWT 后发现我们要算一个形如 \([x^B](-2x-x^2)^{n-t}(x^2+2x+2)^t\) 的东西。把后面的括号二项式展开,即 \((-1)^{n-t}[x^B]\sum\limits_{i=0}^t\tbinom{t}{i}2^{t-i}(x^2+2x)^{n-t+i}=(-1)^{n-t}[x^{B-(n-t+i)}]\sum\limits_{i=0}^t\tbinom{t}{i}2^{t-i}(x+2)^{n-t+i}=(-1)^{n-t}\sum\limits_{i=0}^t\tbinom{t}{i}\tbinom{n-t+i}{B-(n-t+i)}2^{2n-t+i-B}\)

卷积计算即可。

42.互测 13A

首先可以看成第 \(i\) 轮末尾是 \(i+1\) ,这个显然不影响。然后我们有一个思路是,直接把 \(1\)\(2\) 走的 \(k\) 步平移 \(n-1\) 遍。发现只要满足这 \(k\) 步的步幅互不相同,且都控制在 \(k+O(1)\) 内,就不会产生重复。 \(+(4i+1),-4i,+(4i+2),-(4i+3)\) 走一圈即可使得 \(k\) 减掉 \(4\) 。最后根据 \(k \bmod 4\) 分类讨论即可。

43.互测 13B

链的情况是容易的,考虑 2-SAT,即对每个物品都有 \(n-1\) 个变量,表示物品所在位置是 \(\le i\) 还是 \(>i\)

发现这个能拓展到树上的,仍然是 \(n-1\) 个变量,每个变量代表一条边 \((u,v)\) 和物品的相对关系,即在 \(u\) 子树还是在 \(v\) 子树(其实就是在定向,最后形成一棵内向树)

限制每个点与之相邻的边只有至多一条出边,就能得到想要的效果了。现在考虑题目中的限制,第一种是容易的;考虑第二种,相当于 \(u\) 到它的祖先 \(f\) 这条链中的每条边,都得满足:

\(|S_j|\) 内的物品在这条边上的状态相同。考虑并查集维护这个过程,把 \(f\) 按深度排序后处理,则每次操作时一定满足:越浅的边的 dsu 越满,于是直接从 \(u\) 暴力往上跳并修改,如果 merge 不动了就结束过程。

复杂度 \(O(nm+\sum |V_i||S_i|)\)

44.互测 13C

去掉 \(a\) 是容易的。逆用拉格朗日反演,可以推出 \(F(\frac{1-\sqrt{1-4x}}{2})\) 这么一个式子。化成 \(F(\sqrt{1-4x}-1)\) 是容易的,让 \(f_i\) 乘上 \((-\frac{1}{2})^i\) 即可。

化成 \(F(\sqrt{1-4x})\) 也是容易的,计算 \(g_i=\sum\limits_{j\geq i}\tbinom{j}{i}f_j(-1)^{j-i}\) ,差卷积即可。

此时先考虑偶数项,即 \(\sum f_{2i}(1-4x)^i\) ,仍然是差卷积。

再考虑奇数项,注意到 \((1-4x)^{i+\frac{1}{2}}=\sum\limits_{j\geq 0} \frac{(-2)^j(2i+1)(2i-1)\dots(2i-2j+3)}{j!}x^j\) ,仍然能差卷积处理。

45.ucup 2.11 J Suffix Structure

考虑 \(f(i,j)\) 是怎么算的,其实就是从 \(i\) 这个节点出发,然后依次走 \(t_1,t_2,\dots,t_j\) 这些字符。

走到某个时刻要跳 fail 了,发现这之后的信息其实就和 \(i\) 无关,而和 \(i\) 的祖先有关。

具体的,假设我们添了 \(j\) 个字符时走到 \(p\) ,发现要跳了,如果 \(len_{f_p}\le j\) ,那往后的结果就和从 \(1\) 开走的结果相同;否则,只和 \(i\) 的长度为 \(len_{f_p}-j\) 的祖先有关。

如果对每个点求出这个关键的 \(j\) ,就能并查集维护了。那 \(j\) 怎么求呢,可以重链剖分,利用哈希快速往下跳;也有以下做法:

我们想对于一个 \(x\) ,求出哪些点满足 \(end_i=x\)

考虑对 \(u_x\)\(t\) 为模式串,通过 kmp 匹配到 \(t\) 的前缀 \(p\) 。那 \(x\) 能贡献到的 \(i\) ,一定有: \(p\) 存在一个长度为 \(|x|-|i|\) 的 border ,且以 \(x\) 往下的字符中不存在 \(t_{|x|-|i|+1}\)

看上去不好处理。但我们发现一个串的 border 能划分成 \(O(\log n)\) 段等差数列,且每一段的后继字符都是相同的。

所以我们直接往上跳这 \(O(\log n)\) 段,如果 \(x\) 往下不存在这个后继字符,那这一段所有 border 都会对某个 \(i\) 贡献,所以这部分复杂度 \(O(L)\);否则,我们看成是覆盖了 \(x\) 的某条边,每条边只会覆盖一次,所以复杂度还是 \(O(L)\)

46.ucup2.9H Quake and Rebuild

分块维护,对每个点记录 \(f_x,g_x\) 表示往上第一次跳到块外前跳到了哪个点,以及对应的步数。考虑修改,发现有效的整块修改只有 \(O(n)\) 次,因为每个块进行 \(O(\sqrt{n})\) 次修改后都会导致:所有点直接指向块外,即 \(f_x=x\)。散块直接改就好了。而真正的 \(fa_x\) 就打 tag 修改即可。

考虑查询,分成两部分:查 lca ,以及多少个点子树内存在关键点。

对于第一部分,就利用维护的 \(f_x\) 随便跳,直到在同一个块且 \(f_x=f_y\) ,再在块内小跳即可。

对于第二部分,考虑从大往小扫每个块,并让关键点往上跳,跳到一起了就合并。

对于当前块,如果存在一对关键点满足 \(f_x=f_y\) ,则我们直接暴力数块内的合法点,原因是此时至少有一对关键点合并了,总合并次数是 \(O(\sum |S|)\) 的。

否则的话,直接用 \(g_x\) 算就好了。

复杂度就是 \(O((n+q+\sum |S|)\sqrt{n})\)

47.topcoder12294 BoundedOptimization

先考虑去掉下界是容易的,但现在的形式就成了 \(\sum x_ia_i+\sum w_{i,j}x_ix_j\) 了。

然后呢,考虑如果 \(w_{i,j}=0\) ,那 \(i\)\(j\) 中一定有一个卡到了上下界。也就是说所有没卡的点,一定构成了一个团。

枚举这个团,以及团外的点卡的是上界还是下界,此时团内的点就不管上下界了。

能把权值写成一个 \(\sum x_ib_i+\sum\limits_{i<j}x_ix_j\) 的形式,而这个又等于 \(\frac{1}{2}((\sum x_i)^2+\sum x_i(2b_i-x_i))\)\(\sum x_i\) 显然是越大越好的,在这个前提下,你发现 \(x_i-b_i\) 都是相等的,否则能调整变的更优。就做完了。

48.topcoder12304 InducedSubgraphs

分类讨论:\(k\le\frac{n}{2}\) 时,考虑初始的子树和最后的子树,它们中间一定隔了一条链,否则中间转移的时候就会断了。

\(k>\frac{n}{2}\) 时,中间有 \(2k-n\) 个点是固定的,然后令 \(\le n-k\) 的点为红, \(>k\) 的点为蓝,发现删掉固定点后形成的森林中,每个树一定是全红/全蓝,否则也会断。

dp 即可。

49.AtCoder snuke21_j Drink Bar

不妨把所有初始三元组按 \(p\) 排序,此时 \(p_i=i\)
考虑最后得到的三元组 \((a,b,c)\) 是怎么构成的:令 \(p_i=a,q_j=b,r_k=c\) ,则有三种情况:

  1. \(i=j=k\)。数量为 \(n\)

  2. \(i,j,k\) 中存在两个相等。那考虑选择 \((x,y)\) 满足 \(1\le x<y\le n\) ,则它对应了三元组 \((y,\max(q_x,q_y),\max(r_x,r_y))\) 。如果 \(q_x<q_y,r_x<r_y\) 则这里就算重了。用 \(\tbinom{n}{2}\) 减去 \(\sum e_i\) 即可,其中 \(e_i=\sum\limits_{j=1}^{i-1}[q_j<q_i][r_j<r_i]\)

  3. \(i,j,k\) 互不相等。 仍然考虑枚举 \(1\le x<y<z\le n\) ,发现算重的情况是:三个数中存在一个,在至少两维上把其他人偏序掉了。令 \(s_{0,1,i}=\sum\limits_{j=1}^{i-1}[q_j<q_i]\)\(s_{1,2},s_{0,2}\) 类似定义。则我们用 \(\tbinom{n}{3}\) 减去 \(\sum \tbinom{s_{0,1,i}}{2}+\tbinom{s_{1,2,i}}{2}+\tbinom{s_{0,2,i}}{2}\) 。但你发现,如果一个数在三维上都把其他人偏序掉了,那这个情况多减了两遍,于是我们再把答案加上 \(\sum e_i(e_i-1)\) 即可。

\(s\) 二维数点计算,\(z\) 三维数点计算,cdq 分治/二维 BIT 即可,复杂度 \(O(n\log^2n)\)

posted @ 2023-11-20 22:26  grass8woc  阅读(429)  评论(0编辑  收藏  举报