2024.1 ~ 然后是 irony / 再见了 ​melod​y

QOJ2402

容易在 \(O(\log x)\) 步内构造出一个只有 \(x\) 的栈。

考虑从后往前构造,记录当前 + 的数量,假设是 \(k\),那么我们构造一个 \(x_i+k\) 出来即可。

QOJ4996

这么牛??

考虑增量构造,每次插入一个点进来。

设当前的前后缀切换点为 \(x\),当前点为 \(y\),那么如果 \(x,y\) 有连边就把 \(y\) 放到 \(x\) 的无连边一侧;反之放在有连边一侧。经过简单的分类讨论发现,这样一定是合法的。如果当前全部都是无连边或者有连边,直接插入到最后即可。

为了让 \(1\) 当链顶,写起来会麻烦一点。

QOJ895

相当于每种颜色需要有 \(L=\frac{m+1}{2}\) 个匹配。显然需要有 \(2\mid (m+1)\)

考虑每种颜色当前可能是某些匹配和一些单点,假设有 \(p\) 个匹配和 \(n-2p\) 个单点,发现由于单点最后都得形成匹配,那么必须要有 \(n-2p\le m-n+1\),也就是 \(2n-2p\le m+1\)

如果这个限制已经不满足了,那么显然是无解的。否则考虑增量构造,每次从 \(n\to n+1\),并维持此条件成立。容易发现当 \(n=m+1\) 时,必有 \(p=\frac{m+1}{2}\)。于是我们只需要做到 \(n\to n+1\) 即可。下面证明这时一定有解。

考虑建一张二分图,左边有 \(m\) 个点代表 \(m\) 种颜色,右边有 \(n+1\) 个点。对于颜色 \(i\),如果 \(j\) 此时在图中不在 \(i\) 的匹配内,就连边 \(i\to j\);同时对每种颜色 \(i\),设其当前匹配数为 \(p_i\),就连 \(m+1-2p_i-2n\)\(i\to n+1\) 的边表示 \(i\) 不参与匹配。可以发现如果 \(2p_i-2n=m+1\) 那么就不会连这条边,意思是必须被匹配。

这里 \(n+1\) 号点我们认为其可以被匹配 \(m-n\) 次,意思是至少有 \(n\) 种颜色被加上。

现在我们需要证明左边的点都能匹配上。考虑左部点的出度,发现到 \(1\cdots n\) 中恰好连 \(n-2p_i\) 条,于是总的出度就是 \(m-n+1\);再考虑每个右部点的入度,发现此时 \(i\) 恰好在 \(n-1\) 个匹配中,于是其入度恰好是 \(m-n+1\);对于 \(n+1\) 号点,不难算出其入度是 \(m(m-n+1)-n(m-n+1)=(m-n)(m-n+1)\)。那么只需要把这个点拆成 \(m-n\) 个点,就得到了一个左右各 \(m\) 个点的二分正则图。

由 Hall 定理可知二分正则图必存在完美匹配,于是就成功从 \(n\) 扩展到了 \(n+1\)

只需要跑 \(m-n+1\) 次二分图匹配,使用 dinic,总复杂度为 \(O(m^4)\)

LOJ3655

维护行的线段树,发现为了支持这个操作需要维护 \((mn,cnt,sum)\) 表示区间 min,区间 min 的个数,区间和。

对于标记维护 \(add_1,add_2\) 表示区间 min 被加上了 \(add_1\),然后这个区间全局加了 \(add_2\)

同时每个节点维护一个 set,里面存这个点所有的 chkmin 操作。这里我们把这个 set 看成元素而非标记,或者是看成永久化的标记。那么一个点的实际 \(mn\) 就是到根的一条链上的 set 里面最小值再取 min。

对于 chkmin 操作,我们在 \(O(\log n)\) 个节点上插入这个东西并更新 \(mn\),然后一路 pushup。这样可能会导致更深的子树里面的 \(mn\) 出错,但考虑在做加法的时候,我们一路判一下当前到根的链上的 \(mn\) 会不会导致当前的区间 min+ 变成区间整体 +,这样就没有问题了。

如果要撤销一次操作,找到这些标记覆盖到了哪些节点上,同理先下传 add,然后把这个点的标记删除,再 pushup。

然后还需要写一个 ODT 来去除白 $\to $ 白,黑 $\to $ 黑。

2024.1.3

A

连边建图后如果有度数 \(\ge 3\) 的点就无解。否则图一定形成环和链。

考虑一个环,其贡献一定是将答案 \(\times 2\),然后自己内部就解决掉了。考虑一条链,发现选择方向后会贡献一个入点和出点。设长度为 \(1,2,\ge 3\) 的链分别有 \(A,B,C\) 条,那么首先方向的选择会贡献 \(2^{B+C}\) 的系数。

接下来发现将出点和入点匹配的方案数是 \((A+B+C)!\),但是二元环在选择不同方向的时候自己匹配自己的情况会算重。考虑钦定二元环自己匹配自己,发现每匹配一个就会有 \(\frac{1}{2}\) 的贡献。于是赋一个 \(-\frac{1}{2}\) 的容斥系数即可。

B

\(w_l+w_r\) 拆开分别算贡献,线段树简单维护

C

PGF 板子。

这里发现一个事情之前不是很明白啊,为什么需要去除 \(S_i\)\(S_j\) 子串的情况?注意我们列方程的时候直接往后加上一个 \(S_i\) 使其达到目标,然后去考虑实际的结束时间;但我们考虑实际的结束时间的时候总是认为是一段前缀和后缀叠一起,如果出现子串的情况就可能会出现在中间出现的情况。

QOJ4000

看到这种肯定就是要 bitset。操作分块,每 \(B\) 个操作分一块。

考虑当前这一块内的操作影响到的边,一共只有 \(O(B)\) 条,至多影响 \(O(B)\) 个点。然后还有询问,但也只有 \(B\) 个。称这些边和点为关键边和关键点,那么非关键边不会变化。对非关键边缩点,然后算出 \(f_{i,j}\) 表示第 \(i\) 个关键点能否通过非关键边到达第 \(j\) 个关键点,这里可以使用 bitset 优化到 \(O(n+m+\frac{(n+m)B}{w})\)

然后建一张新图,新图中有 \(O(B)\) 个点,\(i\to j\) 有边当且仅当 \(f_{i,j}=1\)。每次暴力加入新边,然后在图上 BFS/DFS 查询 \(u\) 能否到达 \(v\)。这里也可以用 bitset 优化,具体来说考虑我们正常 DFS 是每个点 \(u\) 维护一个 \(vis[u]\),每次访问到 \(u\)\(vis[u]\leftarrow 1\),然后走出边的时候只沿着 \(vis[v]=0\) 的边 \(u\to v\) 走。发现维护邻接矩阵每行的 bitset 之后相当于要对 \(f_i\ \&\ vis\) 进行一个 Find_first,这个可以用 bitset 优化到 \(O(\frac{B}{w})\)

于是就可以在 \(O(\frac{B^2}{w})\) 的时间内完成 DFS 判断,清算一下复杂度,发现是

\[O\left(\frac{q}{B}\left(n+m+\frac{(n+m)B}{w}\right)+q\frac{B^2}{w}\right)=O\left(\frac{q(n+m+B^2)}{w}+\frac{q(n+m)}{B}\right) \]

\(B=O(w)\),复杂度为 \(O(\frac{q(n+m)}{w}+qw)\)

QOJ3998

相当于 \(\sum_{i=1}^k f(i)\ge k\times E\)

考虑一个 \(f(i)\) 咋算,发现已经需要背包了...

注意到对于一个 \(l\),可行的最远的 \(r\) 具有单调性,考虑双指针,发现背包不支持删除比较麻烦...

有一个东西叫 baka's trick 但是这个需要支持信息能快速合并

考虑整体二分,\(\text{solve}(l,r,s,t)\) 表示确定了 \([l,r]\) 中的最远右端点都在 \([s,t]\) 中,然后取 \(p=\lfloor(l+r)/2\rfloor\),考虑算一下 \(p\) 的最短的可行区间。我们维护一个全局的背包,在 \(\text{solve}(l,r,s,t)\) 的时候背包里面存的是 \([l,r]\cup[s,t]\) 外面的所有物品,这里可能有些是涨价前的有些是涨价后的但都无所谓,总之它们一定在背包内且价格恒定。

然后这里算 \(mp\) 发现如果正着扫需要进行一个背包删除,又寄了。解决方法是二分答案,先取 \(mr=\lfloor (s+t)/2\rfloor\),然后把 \([s,mr]\) 中的物品涨价加入,\([mr+1,t]\) 中的物品正常加入,判断是否合法;如果要往一侧二分,那么就提前加入另一侧的物品。这样复杂度是 \(T(n)=T(n/2)+O(n)=O(n)\),于是加入次数就是 \(O(|s-t|)\)

然后我们算出来最短右端点 \(q\) 之后要递归到 \(\text{solve}(l,p-1,s,q),\text{solve}(p+1,r,q,t)\),额外加入多余的部分就行了。注意背包虽然性质很弱只能插入,但它可以和插入等时间地复制。

UOJ群

给一个长为 \(n\) 的字符串和 \(k\),你需要对其每个长为 \(k\) 的子串算出来其最短整周期的长度。

\(1\le k\le n\le 2\times 10^6\)

暴力:\(O(n\times d(k))\)

考虑选一个 \(m\),可以 \(O(n)\) 算出来每个长为 \(k\) 的子串的最短整周期是否为 \(m\) 的约数。于是只需要对每个 \(p^i\mid k\) 都去尝试 check 一下 \(\frac{k}{p^i}\) 这个长度是否为其周期,就可以确定每个位置实际的最短整周期。

复杂度显然不会超过 \(O(n\log n)\)

Luogu6113

怎么这个还有板子题的

recall 一下 Tutte 矩阵:考虑 \(\frac{n(n-1)}{2}\) 个变量 \(x_{i,j}\)\(i< j\)),考虑如下矩阵

\[A_{i,j}=\begin{cases}x_{i,j}&,(i,j)\in E\land i<j\\-x_{j,i}&,(i,j)\in E\land i>j\\0&,(i,j)\not\in E \end{cases} \]

我们依次证明几个定理:

  • \(G\) 存在偶环覆盖,当且仅当 \(G\) 存在完美匹配。

其中偶环覆盖指的是用若干点不相交的大小为偶数的简单环覆盖整张图,这里二元环也算偶环。

考虑完美匹配可以看作若干二元环的覆盖,而对于一个偶环覆盖,将其中的每个偶环隔一个取一条边即可得到一个完美匹配,因此二者等价。

  • \(G\) 存在偶环覆盖,当且仅当上面的矩阵 \(A\) 的行列式不为 \(0\)

考虑算行列式的时候会取到一个 \(p\) 并附上 \(\text{sgn}(p)\) 的系数,然后把 \(A_{i,p_i}\) 相乘。

考虑一个使得 \(A_{i,p_i}\neq 0\) 的排列 \(p\),发现这相当于用若干环覆盖整张图。

我们发现只要存在一个奇环,

额咋证来着,好像是奇环的 \(\sum \text{sgn}(p)\) 之和为 \(0\) 啥的,反正这个是对的

  • \(G\) 的最大匹配为 \(\frac{1}{2}\text{rank}(G)\)

感性理解一下就是选出一个点集使得其存在偶换覆盖,也就是 \(\text{det}\neq 0\)

那带着 \(x\) 直接做高斯消元肯定不现实,但是我们有 S....-Zi... 定理,任取 \(x_{i,j}=\text{rand}(0,p-1)\),那么就有 \(1-\frac{n}{p}\) 的概率算对。多带几次把算出来的 \(\text{rank}\) 取众数即可。

坏处是复杂度为严格 \(O(n^3)\),过不去这个题...

QOJ4998

考虑每次 \(1\) 操作相当于连边 \((l,r),(l+1,r-1),\cdots\)\(2\) 操作是查询 \((a,x),(a+1,x+1),\cdots\) 是否都分别连通了。考虑直接维护连通块,那么合并次数至多为 \(n-1\)。我们要做的就是快速找到所有发生合并的位置。

考虑对每个点所在的连通块维护一个哈希值,然后线段树维护整体的区间哈希值。只需要在线段树上维护一个区间正着的哈希和反着的哈希即可快速得到所有合并的位置,在合并的时候使用启发式合并暴力更改小的那一侧的所有哈希值即可。总复杂度 \(O((n+q)\log^2n)\)

区间哈希可以用树状数组实现,对完了

P9997

对树进行轻重链剖分。

对于查询,我们将贡献分为两部分:跨越重链的,以及在一条重链内部的。

对于跨越重链的,考虑枚举它经过了哪条轻边,那么对于一条轻边 \(O(X)\) 种情况,这部分的复杂度 \(O(X\log n)\)

对于重链内部的,考虑对每个满足 \(u\)\(top_u\) 路径上至少有 \(X\) 条边的点 \(u\),维护 \(u\) 上面 \(X\) 条边正着下来或者倒着上去形成的字符串的哈希值 \(f_u,g_u\)。那么每次就是查询一条链上有多少个 \(f_u=\) 给定字符串的哈希值。维护树状数组套哈希表即可。时间复杂度单次 \(O(\log n)\)

考虑修改,发现一共只会经过 \(O(\log n)\) 条重链,且至多只会影响一个重链内的一个长度为 \(O(X)\) 的区间内的 \(f,g\),重新计算这些 \(f,g\) 即可。这样修改的复杂度也不超过 \(O(X)\)

于是重链内部就是有 \(O(mX)\) 次单点修改,\(O(m)\) 次查询一条链上 \(=v\) 的元素个数。离线下来容易解决。

总复杂度 \(O(n+mX\log n)\)。写起来比较繁杂,但各部分想清楚都不难实现。

2024.1.5

zkw 费用流:就是多路增广。在层数比较少,或者费用较小/图比较稠密的时候表现比较好。

其他时刻可能不如 EK。

dij 费用流

类似 Johnson 全源最短路进行重标号 \(h\)

\(d'[i]\) 表示 \(w'(x,y)=w(x,y)+h[x]-h[y]\) 的边权下 \(s\to i\) 的最短路,考虑每次增广一条最短路之后,对每条 \((i,j)\) 我们会加入 \((j,i)\),必有 \(d'[i]+w'(i,j)=d'[j]\iff d'[i]+h[j]+w(i,j)-h[j]-d'[j]=0\)

于是令 \(h'[i]\leftarrow h[i]+d'[i]\),我们新加入一条 \(w(j,i)=-w(i,j)\) 之后的边之后,有

\[w'(j,i)=h'[j]+w(j,i)-h'[i]=h'[j]-w(i,j)-h'[i]=h[j]+d'[j]-w(i,j)-h[i]-d'[i]=0 \]

于是对于新加入的那条最短路上的边,这个不等式仍然成立。对于原图中的边,考虑三角不等式:

\[d'[i]+w'(i,j)-d'[j]\ge 0\\\iff d'[i]+h[i]+w(i,j)-h[j]-d'[j]\ge 0\\ \iff h'[i]+w(i,j)-h'[j]\ge 0 \]

所以直接令 \(h'[i]\leftarrow h[i]+d'[i]\),就是一个合法的新的重标号。

于是我们就可以跑 dij 啦

最小费用可行流

一直增广直到新的增广路的费用 \(>0\)。最大费用同理。

由于费用流的费用关于流量成凸函数所以就是这样。

有负环最小费用流

对于每条负边 \((u,v)\),容量为 \(c\),费用为 \(d<0\),先把 \(c\times d\) 加到答案里,然后连边 \(s\to u,v\to t\),上下界都为 \(c\),再连边 \(v\to u\),上下界 \([0,c]\),费用 \(-d\)。然后跑有源汇上下界最小费用流。

P9999

写一下代码...

考虑维护这样一个 FHQ Treap,维护若干个点,其中 dfn 为比较关键字,同时每个点额外记录 \(d\) 表示这个点到其重链链顶的距离,每个点还需要维护子树中 \(d\) 的最小值。

现在考虑将所有点向 \(u\) 移动一步。先考虑 \(u\) 到根链上的点,这部分会有 \(O(\log n)\) 次重链交换,依次考虑每条重链,这上面的 dfn 是连续的,可以找到哪个点需要下来,然后改一下这个点,同时给这段区间打一个 \(\text{DFN}+1,d+1\) 的标记。

再考虑链外面的点,发现仍然是 \(O(\log n)\) 段 DFN 的连续区间,但 \(d=0\) 的位置需要暴力重新计算。那就把这些点先 split 出来之后,别的地方打标记,把 \(\text{DFN}-1,d-1\)

平面图两点可达性

对于每个点,把其出边对面的点按照和他连线的斜率排序,第一次 DFS 正着扫,第二次倒着扫,然后分别算出两次的 DFS 序 \(p,q\),那么 \(x\) 能到 \(y\) 当且仅当 \(p_x<p_y,q_x<q_y\)

但是这个不能处理环,需要缩点。动态咋做呢,我也不太会

哎这不是我们 [CEOIxxxx] Traffic 吗,zzyz 模拟赛都有

2024.1.6

A

钦定完 \(k\) 个点后,一个点的贡献形如 \(a_i\times \left(\binom{k}{2}-\sum_{j}\binom{cnt_j}{2}\right)\)

\(f_{u,j}\) 表示 \(u\) 子树内放了 \(j\) 个点,此时的最大贡献即可。

B

打表找规律发现所有可能的 \(a_i\) 满足:

  • \(a_1=0/1,a_n=0/1\)
  • \(|a_i-a_{i+1}|\le 1\)
  • 不存在 \(2\le i\le n-1\) 使得 \(a_{i-1}=a_{i+1}=0,a_i=1\)

对着这个 DP 即可。

C

先补全成三角剖分,然后按照 2023.3 zzyz 模拟赛 xxx 题目的方式分治即可。

注意这里带边权,分治下去的时候如果选的是 \((u,v)\),那么 \(u\to z,v\to z\) 的边权都要重新赋值为当前 \(u,z\) 或者 \(v,z\) 两点间的最短路。

2nd Ucup Stage.17 : Jinan

这部分是场上写的。

D

\(r_a-l_a+1\ge 10,r_b-l_b+1\ge 10\) 的时候答案是 \(9\);否则暴力。

K

\(a_i\leftarrow a_i-i\),考虑对一个区间咋算答案,发现是取中位数,把别的都挪到中位数。

双指针,权值线段树维护第 \(k\) 大和区间 \(\sum a_i\) 即可。离散化一下。

B

根号分治,取阈值为 \(B\)\(k\le B\) 直接 DP:\(f(u,j)\) 表示 \(u\) 子树内挂一个大小为 \(j\) 的连通块的方案数。

转移的时候考虑新的边要不要割掉即可。考虑 \(k>B\) 的时候,我们的问题是不知道 \(u\) 这个连通块的大小。

考虑直接记录 \(g(u,x,y)\) 表示 \(u\) 子树内已经划分出去 \(x\)\(k\)\(y\)\(k+1\) 的方案数,这样就可以直接知道 \(u\) 所在连通块的大小;而 \(x+y\le n/B\),并且感觉上要保持 \(u\) 所在连通块大小 \(\le k+1\),这个 \(x+y\) 状态数不会很多。

复杂度不知道是啥。但是取 \(B=n^{\frac{2}{3}}\),复杂度已经不超过 \(O(n^{\frac{5}{3}})\);而且感觉 \(g\) 的状态卡不满,应该能过!过了。

E

最小点覆盖比较好考虑。判断每个点能否在最小点覆盖内,然后如果一条边 \((u,v)\) 两端点有一个可以在任意一个最小点覆盖内就不合法,否则显然一定合法。只需要判断每个点能否在最小点覆盖内。

建图,\(s\to L_i,R_i\to t\),这些边的边权为 \(1\)\(L_i\to R_j\),这些边边权 \(\infty\)。在残量网络上考虑,一条边 \(u\to v\) 是可行边当且仅当 \(u\) 无法在残量网络上到达 \(v\);是必须边当且残量网络上仅当 \(s\) 能到 \(u\)\(v\) 能到 \(t\)。当然还要满流。

注意也不需要有向图两点可达性,因为 \(u\to v\) 满流所以一定存在 \(v\to u\) 这条边,只需要判是否在同一 scc 内。

日为什么 TLE 啊??怎么能 \(O((n+m)\sqrt{n+m})\) 跑不过 1e5 的

cnm 边数开小了 666666666666666666666666666666666

M

\(R\) 一定是凸包。\(Q\) 应该是枚举一条边 \(AB\),把然后加一个点 \(C\),改成 \(AC\to CB\) 这样子。

那么相当于判断 \(\triangle ACB\) 内部是否有一个点。考虑两个点 \(C_1,C_2\),发现这里由于 \(C_1,C_2\)\(AB\) 的同侧(是凸包),因此 \(C_2\)\(\triangle AC_1B\) 内当且仅当 \(\ang C_1AB>\ang C_2AB,\angle C_1BA>\angle C_2BA\)。极角排序即可。

L

相当于区间内全是 \(1\) 就有一些收益,对每个 \(k\) 求最大收益。

考虑 DP,\(f(i,j)\) 表示前 \(i\) 个位置放了 \(j\) 个 0,转移的话如果这里放 \(0\)\(f(i,j)\leftarrow f(i-1,j-1)\),否则枚举一个极长的 \(1\) 的连续段,转移到 \(f(p,j)+\text{cost}(p+1,i)\),其中 \(\text{cost}(l,r)\)\([l_i,r_i]\subseteq [l,r]\) 的所有 \(v_i\) 之和。

考虑线段树维护 cost,这样有一个 \(O(n^2\log n)\) 的做法,按 \(j\) 从小到大转移,这样好像空间就是 \(O(n)\) 了。

但是这个显然过不去吧!!!唉唉会不了一点

Hello 2024

E

首先我们在 \(p\) 中插入一个 \(0\),现在就等价于要将 \(p\) 进行排列,使得 \(p_0=0\),且 \(|p_i-p_{i+1}|=1\)

这个题 \(n\le 5000\),考虑直接枚举 \(p_n=s\),然后从小到大依次放入每个数,维护当前还需要插入的空位个数。

考虑如果当前形成了 \(x\) 个空位,我们现在要插入 \(y\) 个数进去,且每个空位内至少插入一个数,考虑插板法,那么方案数就是 \(\binom{y-1}{x-1}\)。然后考虑新的空位有多少个,发现是 \(y-x\) 再加上两端是否还要插入新的数。由于已经枚举了起点和终点,因此两端是否已经成段是唯一确定的,可以直接算出新的段数。

F

考虑当前水量 \(x\) 以及被限流的水量 \(y\)

一开始 \(x=0\),每次先 \(x\leftarrow \max(0,x+a_i-b_i)\),然后如果 \(x>c_i\),就令 \(y\leftarrow y+x-c_i,x\leftarrow c_i\)

答案就是 \(\sum a_i-x-y\)

将操作离线,扫描线扫序列维,数据结构维护每个时刻当前 \(x,y\) 的值。这些都可以用 segtree beats 简单维护。


2nd Ucup stage 17: Jinan

唉来补个题

L

看眼复杂度,\(O(n(n+m)\alpha(n))\) 是什么玩意阿

还是考虑 DP,那么相当于有 \(O(nm)\) 次前缀 \(+v\)\(O(n^2)\) 次求全局 max。

考虑维护 \(p_i\) 表示 \([1,i]\) 的前缀 max 的位置,那么相同的 \(p_i\) 会形成若干极长的连续段,并且从前往后看的话每个连续段对应的值是递增的(就是这个连续段中最靠前的一个此时的值)。维护 \(q_i\) 表示这一段和上一段的差,那么每次相当于给某个连续段的 \(q_i\) 减去一个值,然后如果 \(q_i<0\) 就和上一段合并,再接着看下一段是否需要合并。

由于加的都是正数,所以只会有合并,没有分裂。现在考虑我们还需要快速找到这个点在哪一段内,并查集维护即可。这样复杂度就是 \(O(n(n+m)\alpha(n))\)

关于空间:按照 \(i\) 从小到大转移即可。

2024.1.9

唉被打爆了

C

最简单的题,但是最后半小时才开,赛后 1min 过题 again/zk

考虑先填好前 \(n\)\(k\) 列,然后一列一列填。假设在填第 \(i\) 列,考虑第 \(i-k\) 列的情况:

  • 如果有两个连续的 \(1\)\(0\),那么可以直接确定第 \(i\) 列对应位置也是两个 \(1\)\(0\),进而朝两侧确定所有。
  • 如果全是 \(01\) 交错,那么第 \(i\) 列也是 \(01\) 交错。

于是现在问题变为给前 \(n\)\(k\) 列填入 \(01\),使得每相邻两行之和为 \(k\),且如果有 \(i\) 列是 \(01\) 交错,则造成 \((2^{k-1})^i\) 的贡献,这样算的总贡献和。将恰好容斥为钦定,并将贡献改为 \(2^{k-1}-1\),注意到钦定 \(i\) 列为 \(01\) 交错的方案数是

\[\binom{k}{i}\times 2^i\times\sum_{j=0}^{k-i}\binom{k-i}{j}^n \]

含义为:先选 \(i\) 列,然后这 \(i\) 列方案数为 \(2^i\),对于剩下的 \(k-i\) 列,枚举第一行放了 \(j\)\(1\),则每行方案数均为 \(\binom{k-i}{j}\)。于是答案就是

\[\sum_{i=0}^k\binom{k}{i}\times (2^{k-1}-1)^i\times 2^i\times\sum_{j=0}^{k-i}\binom{k-i}{j}^n \]

暴力计算即可。复杂度 \(O(k^2)\)。FFT 即可做到 \(O(k\log k)\)

A

我觉得这个难爆了啊!!

黑点染两遍相当于把黑点个数从 \(i\to i+1\) 的期望步数变成 \(f_i=\frac{n}{n-i}\)

我们这样来算答案,我们定义这个过程为在每个白点两侧都为黑点的时候(或者全局不存在白点)停机,否则我们不管那些当前应当被操作 1 染黑,但仍为白色的白点,而是把他们看作可以染黑的一个正常的白点。可以发现,只要当前没有停机,这样算出来的期望也是正确的。

那么这样就可以考虑如果当前有 \(i\) 个黑点,算出当前未停机的概率,乘上 \(f_i\) 求和即可。可以发现在没有停机的时候所有状态都是等概率的,因此未停机的概率就是

\[g_i=1-\frac{\binom{i}{n-i}}{\binom{n-1}{n-i}} \]

答案即为 \(\sum_{i=0}^nf_ig_i\)

B

暴力 DP 是,\(f_i=\min_{j=1}^i\max(f_{j-1}+b,f_{i-j}+a)\)

然后可以观察到 DP 形成的段数很少,一段一段转移即可通过 \(1\le a,b\le 10^3\) 的点。

考虑重新设状态,\(g_{i,j}\) 表示代价不超过 \(ai+bj\) 最多能到多大的 \(n\),也就是最大的 \(n\) 使得 \(f_n\le ai+bj\)

但这样设状态的话,初值 \(g_{i,0}\) 实际上并不好计算,不过我们倒是可以得到一个没啥用的转移方程:

\[g_{i,j}=g_{i-1,j}+g_{i,j-1}+1 \]

意思是我们考虑 \(n=g_{i-1,j}+g_{i,j-1}+1\) 的时候,取分界点为 \(g_{i-1,j}\),递归到右边的话就可以用 \(ia+(j-1)b\) 再加上这一层的 \(b\) 解决;否则就是 \((i-1)a+jb\) 加上这一层的 \(a\)。显然 \(n\) 也不会超过这个。

考虑倒过来做,不妨设 \(a>b\),二分答案 \(mid\),然后设 \(g_{i,j}\) 表示当前已经用了 \(ai+bj\),接着往后走但是不能超过 \(mid\),最多能走完多少的 \(n\),那么如果 \(ai+bj>mid\)\(g_{i,j}=0\);否则

\[g_{i,j}=g_{i+1,j}+g_{i,j+1}+1 \]

那么 \(g_{i,j}\) 相当于要选一个 \(ax+by\le mid\) 的点 \((x,y)\),然后算一下 \((x,y)\to (a,b)\) 的方案数。

于是

\[g_{0,0}=\sum_{i=0}^{\lfloor mid/a\rfloor}\sum_{ai+bj\le mid}\binom{i+j}{i}=\sum_{i=0}^{\lfloor mid/a\rfloor}\binom{i+A_i+1}{i+1} \]

其中 \(A_i=\left\lfloor\frac{mid-a\times i}{b}\right\rfloor\) 为最大的 \(j\) 使得 \(ai+bj\le mid\)

注意到 \(mid\le a\log n\)(由于钦定了 \(a>b\),每次取中点即可得到一个 \(\max(a,b)\log n=a\log n\) 的方案),于是 \(\lfloor mid/a\rfloor\le \log n\),组合数直接暴力算,总的复杂度就是 \(O(\log^2n(\log a+\log \log n))\)

2024.1.10

ak 了

这下这下了,现在模拟赛得分不是 \(300\) 就是 \(0\) /xk

A

先放宽成 \(\max\le i\),从小到大加点维护 DDP 即可。\(O(n\log^2n)\)

实际上不用做这个加点的过程,直接 \(f_{u,j}\) 表示 \(u\) 子树内必选 \(u\),且 \(\max=j\) 的连通块个数。转移是 max+ 卷积,先差分后线段树合并维护即可。这里统计答案还需要每个位置维护一个向量,然后打一个形如 \(g\leftarrow g+f\) 的 tag。这样复杂度就是 \(O(n\log n)\)

B

可以发现只要找到一个人不是乐子人,就可以用 \(2(n-1)\) 次询问确定每个人的情况。这个就把序列重排一下让这个身份已知且不为乐子人的人站在开头,然后每次问 \(i,i+1\) 中有多少个好人/有多少个坏人即可递推出 \(i+1\) 的身份。

现在考虑怎么找到一个不是乐子人的人。注意到乐子人只有 \(\le\frac{n}{4}\) 个,因此随机一个人,问他 \(100\)\(typ=1\) 的询问,只要有两次回答不一样就一定是乐子人;如果全都一样,观察交互库实现发现真的在用 mt19937 来随机,因此直接判定他是好人或坏人,错误率仅为 \(\frac{1}{2^{99}}\)。这样就可以在期望 \(\frac{4}{3}\times 100\) 次询问内找到一个好人/坏人。

题解的做法:先考虑每个人都是好人或者坏人,且乐子人个数 \(\le \frac{n}{2}\) 的时候怎么做。发现直接选取一个集合 \(S\),对所有人都询问一遍然后取众数那就一定是正确答案。于是考虑将当前集合 \(S\) 划分为大小相等的两个子集 \(S_1,S_2\),然后对 \(S_1\) 做询问,如果 \(S_1\) 中好人个数仍然 \(\ge \frac{|S_1|}{2}\) 就往 \(S_1\) 递归,否则 \(S_2\) 一定符合条件,往 \(S_2\) 递归即可。

这样的询问次数不超过 \(2n\)\(\sum k\) 大约是 \(n\times\frac{n}{2}+\frac{n}{2}\times \frac{n}{4}+\frac{n}{4}\times \frac{n}{8}+\cdots\to \frac{2}{3}n^2\),可以通过。是确定性的。

C

莫队然后随便做一下,要空间 \(O(n)\) 只需要单拎出来出现次数 \(>\sqrt{n}\) 的数。

ARC146

C

之前模拟赛场切了

D

先考虑怎么判合法,将限制改写为:

  • \(A_{P_i}\le X_i\iff A_{Q_i}\le Y_i\)
  • \(A_{P_i}\ge X_i\iff A_{Q_i}\ge Y_i\)

不难发现和原来是等价的。那么写出变量 \(x_{i,j}=[A_i\le j],y_{i,j}=[A_i\ge j]\),建图:

  • \(x_{i,j}\to x_{i,j+1},y_{i,j}\to y_{i,j-1}\)
  • \(x_{i,j}\to \lnot\ y_{i,j+1},y_{i,j}\to \lnot\ x_{i,j-1}\)
  • \(x_{P_i,X_i}\iff x_{Q_i,Y_i},y_{P_i,X_i}\iff y_{Q_i,Y_i}\)

可以发现有用的点数只有 \(O(N+M)\) 个,对这些点连边建图跑 2sat 即可。

现在考虑怎么求出和最小的一组,可以发现这一堆下界之类的应该同时取到,那直接尽量给 \(x\) 赋值为 \(1\),给 \(y\) 赋值成 \(0\) 就好了。怎么判定能不能给 \(x\) 赋值成 \(1\) 呢,这个就类似求 2sat 字典序最小解,从前往后依次 dfs 就行

实现的时候其实可以注意到 \(x_{i,j}=\lnot\ y_{i,j+1}\),于是只对 \(x\) 连边就行。


看眼题解。题解在说啥啊?看上去好像和我爆搜 2sat 一样的啊。

E

感觉这个真和 Hello 2024 E 一模一样啊(或者说应该是那个重这个?233),做过那个之后这个很快就会了啊。

考虑按值域从小到大插入数,维护当前空位数。这里空位指的是可以往里面插入 \(i+1\) 使得合法的未知数。

假设当前插入了 \(\le i\) 的数,且有 \(j\)\(i,i\) 相邻的空位。

每次要把 \(A_{i+1}\)\(i+1\) 插入到空位里,且每个空位至少被插入一个。

那么一个空位如果插入了两个 \(A_{i+1}\) 就会继承下去一个空位,如果插入了一个 \(A_{i+1}\) 则这个空位就会消失。但两端不同,例如左边有一个 \(=i\) 的那你插入一个 \(=i+1\) 的可以新建空位,同时也可以在左边使劲放 \(i+1\) 造出一堆空位。

那为了方便我们认为 \(j\) 里面不包含左右的空位,同时额外记录左右是否有空位。

发现首先需要 \(A_i\ge j\),然后还剩 \(A_i-j\) 个,这部分每放一个就多一个空位,左右是否多空位只会影响当前的组合数,但是不影响空位个数。于是只需要记录 \(f_{i,0/1,0/1}\) 表示当前左右两边是否还有空位即可。

哦好像有问题,如果左边可以放的话,那么这里实际上可以放 \(A_i\) 但是没有多空位,也就是说当前的 \(j\) 个空位可以变成 \(A_i-j,A_i-j-1,A_i-j-2\) 个空位。但你注意到如果不往左边放,那么左边直接就结束了;同理不往右边放的话也是直接结束,因此如果变成 \(A_i-j\) 之后就一直这样被 \(A_i\) 减下去了;变成 \(A_i-j-1\) 之后后面都顶多再额外 \(-1\)。画个图就会发现每一层最多只有三个点:

于是每一层最多 \(12\) 个状态,直接转移即可。

具体写一下状态和转移:\(f(i,j,0/1,0/1)\) 表示考虑了 \(\le i\) 的数,左右是否有空位。

首先如果 \(j>A_{i+1}\) 那么这个状态将无法转移。另外还需要 \(j\neq 0\) 或者左右有空位,否则 \(i+1\) 没地方填。

转移有:

  • \(f(i,j,p,q)\times\binom{A_{i+1}-1}{j-1}\to f(i+1,A_{i+1}-j,0,0)\),表示左右都不填。
  • \(f(i,j,1,p)\times \binom{A_{i+1}-1}{j}\to f(i+1,A_{i+1}-j-1,1,0)\),表示填左不填右。
  • \(f(i,j,p,1)\times \binom{A_{i+1}-1}{j}\to f(i+1,A_{i+1}-j-1,0,1)\),同上。
  • \(f(i,j,1,1)\times\binom{A_{i+1}-1}{j+1}\to f(i+1,A_{i+1}-j-2,1,1)\):两边都填。

我偷懒写了个 map 来存状态。这样并不会增加复杂度,因为 map 里面存的状态数是 \(O(1)\) 的。

ARC146F

\(Q_i\) 表示 \(i\) 的出现次数,即 \(P_{Q_i}=i\)。设 \(C_i\) 表示第 \(i\) 个时刻身上的诅咒个数。

发现只要 \(1\) 没有出现过,那么总有 \(C_i=i\),也就是对 \(i<Q_1\) 均有 \(C_i=i\)

然后到达 \(Q_1\) 这个位置之后发现,首先会删掉一段极长的 \(1\) 的前缀,如果删除了 \([1,v]\),那么剩下其实变成了横坐标在 \([v+1,N]\) 的这个子矩形里面的一个子问题。考虑 \(Q_{v+1}\),发现在 \([Q_1,Q_{v+1})\) 这个区间内都有 \(C_i=i-v\)

这里有两个贡献,一个是 \(\prod C\) 带来的贡献,一个是排列的方案数。对应到矩形上就是每行有一个贡献,每列有一个贡献。考虑设 \(f(i,j)\) 表示现在在考虑 \(i\)\(j\) 列的子矩形,只需要计算这 \(i\) 行的贡献和这 \(j\) 列的贡献。

那么转移的时候考虑 \(1\) 的位置以及此时的极长前缀连续段,可以写出来一个很暴力的转移,大概是 \(O(n^4)\) 级别。

考虑换个维度,一列一列填,也就是我们依次填 \(Q_1,Q_2,\cdots,Q_N\),填好 \(Q_1\) 后我们直接算出前面 \(Q_1-1\) 列的贡献即 \((Q_1-1)!\),并维护当前的前缀最大值 \(w\),如果 \(Q_i<w\) 那么不需要计算它的行贡献,只需要算列贡献;否则要计入 \(\prod_{k=j-i+1}^{Q_i-i}k\) 的行贡献。并且由于每个位置的 \(C_i< M\),需要有 \(Q_i-i<M\)

于是可以设 \(f(i,j)\) 表示填好了 \(Q_1,Q_2,\cdots,Q_i\),目前 \(\max Q_x=j\) 的总贡献和。转移有两种:

  • \(f(i,j)\times (j-i)\to f(i+1,j)\),表示填一个 \(\le j\) 的数,只做列贡献。
  • \(f(i,j)\times \prod_{k=j-i}^{p-i-1}k\to f(i+1,p)\),表示填一个 \(p>j\),且计入这些行的贡献。

这样可以得到一个 \(O(NM)\) 的做法,写一下发现可以过 146146 146 的大样例。

考虑其组合意义,发现很像格路计数啊,一开始在 \((1,1)\),有 \(1\) 的贡献,然后每次可以选择

  • \((i,j)\to (i+1,j)\),并将贡献乘上 \(j-i\)
  • \((i,j)\to (i+1,j+1)\),将贡献乘上 \(j-i\)
  • \((i,j)\to (i,j+1)\),将贡献乘上 \(j+1-i\)。如果要走这一步,那么上一步不能形如 \((i,j)\to (i+1,j)\)

现在要走到 \((N-1,N)\),求所有格路的贡献和。要求不能走到 \(j-i\ge M\) 的点处。

额这是啥啊?


wocao 优化这个看上去需要什么恐怖poly,先摆了

P5311

咋办啊,我真没脑子了

考虑询问的所有 \(x\) 都是根怎么做,此时一种颜色 \(i\) 相当于有 \(O(cnt_i)\) 个 2side 矩形加,扫描线简单做到 1log。

考虑 \(x\) 不同时怎么做,点分治,设当前分治中心为 \(p\),如果 \(p\to x\) 路径上每个点都在我们询问的 \([l,r]\) 中,那么 \(\text{ans}(x,l,r)=\text{ans}(p,l,r)\),否则 \(\text{ans}(x,l,r)\) 不可能有跨过 \(p\) 的贡献,递归下去即可。

总复杂度 \(O(n\log ^2n+q\log n)\)

这里有个修改和查询上的不平衡,改用 log 叉线段树可以除一个 loglog,当然也不太实用。

P7126

咋办啊,又没脑子还眼瞎

注意这样连边形成的图并非森林。考虑对每个连通块钦定一个点做代表元,仅统计代表元的数量。

考虑对一个连通块找到若干最浅点,发现这些点一定有公共的 \(\lfloor \frac{C}{2}\rfloor\) 级祖先。

以该点 \(x\) 为代表元,考虑其成为代表元的充要条件:

  • \(x\)\(\lfloor \frac{C}{2}\rfloor\) 级儿子内至少选一个点。
  • \(x\) 子树内大小为 \(\lfloor \frac{C}{2}\rfloor-1\) 的邻域,以及 \(x\) 的子树外的大小为 \(\lceil\frac{C}{2}\rceil\) 的邻域中不存在别的被选中的点;否则该连通块的最浅点将成为其他点。

不难发现这是充要的。

然后这样写还要分子树内外讨论非常的麻烦啊,考虑在多个最浅点的时候,直接把贡献放在编号最小的一个点上面统计。容易发现这个和上面是等价的,相当于把统计的祖先放到了 \(\frac{C}{2}\) 级儿子中编号最小的一个上面。

那现在只需要对每个点 \(x\),求出其大小为 \(C\) 的邻域中:

  • 满足 \(y<x,\text{dep}_y\le \text{dep}_x\) 的最大的 \(y\)
  • 满足 \(y>x,\text{dep}_y<\text{dep}_x\) 中最小的 \(y\)

考虑当前分治重心为 \(p\)\(d_y=\text{dist}(y,p)\),那么相当于 \(d_x+d_y\le C,\text{dep}_y\le \text{dep}_x\) 这样的范围内求 \(x\) 的前驱。把所有点按照 \(d\) 排序,按编号维护线段树,每次插入一个,然后查询在线段树上二分即可。

在算出 \(i\) 邻域内比他优先级更大的点的前驱后继 \(s_i,t_i\) 之后,\(i\) 造成贡献的条件就是 \(l\in(s_i,i],r\in[i,t_i)\),离线扫描线配合树状数组即可解决。总时间复杂度 \(O(n\log^2n+m\log n)\)

代码并不难写,但轻微卡常。

2024.1.13

A

补图三元环个数:见 ...open cup .... I

B

分治,考虑算出跨过 \(mid\) 的询问第一次跨过 \(mid\) 走了多少步,以及第一次出去在哪。

注意到走出去之前不需要考虑 \(mid\) 左侧的位置,于是对每个 \(i\)\(p_i\) 表示 \(l\) 至少是多少才能跳出去,然后查询这个只需要树上倍增。

C

\(f_i\) 表示一次走 \(i\) 步的概率,\(F\) 为其生成函数,答案就是 \([x^c]F+F^2+\cdots+F^m\),其中乘法是循环卷积。

出题人非常好心地给了存在单位根的 \(\bmod{(x^{2^n}-1)}\) 意义下做循环卷积,直接 DFT 后分别变换即可。

[数据删除]

[数据删除]

CF1458D

我草这谁会啊???

\(0\) 看成 \(-1\)\(1\) 看成 \(1\),每个 \(i\) 连边 \(\text{sum}_i\to \text{sum}_{i+1}\),其中 \(\text{sum}\) 是前缀和。

发现题目那个操作刚好就是把一个正着走的环给反过来。找一个字典序最小的欧拉路径即可。

QOJ7309

考虑设 \(f(i,j)\) 表示 \(a\) 的前 \(i\) 段和 \(b\) 的前 \(j\) 段的 LCS,考虑转移。

显然如果 \(a_i\neq b_j\),那么只能转移到 \(\max\{f(i-1,j),f(i,j-1)\}\)

否则我们枚举长为 \(a_i\) 的后缀选了多长,转移到

\[\max\left\{\left.f(x,y)+\min\left\{\sum_{t=x+1}^i[a_t==a_i]c_t,\sum_{t=y+1}^i[b_t==t_j]d_t\right\}\right|x<i,y<j\right\} \]

做一个前缀和,\(L(i,j)\) 表示 \(a\) 的前 \(i\) 段中 \(j\) 的总长,\(R(i,j)\) 表示 \(b\) 的前 \(i\) 段中 \(j\) 的总长,那么转移式可写作

\[\max\{f(x,y)+\min\{L(i,a_i)-L(x,a_i),R(j,b_j)-R(y,b_j)\}|x<i,y<j\} \]

注意到

\[\min\{L(i,a_i)-L(x,a_i),R(j,b_j)-R(y,b_j)\}\\=\min\{L(i,a_i)-R(j,b_j),L(x,a_i)-R(y,b_j)\}+R(j,b_j)-L(x,a_i) \]

于是按 \(L(x,a_i)-R(y,b_j)\)\(L(i,a_i)-R(y,b_j)\) 的大小关系分别维护即可。

ARC129E

看着就很切糕啊,考虑 \(|x_i-x_j|W_{i,j}\) 咋建图。

把贡献拆开,那么变成如果 \(x_j\ge x_i+1\) 就需要 \(W_{i,j}\) 的代价,然后 \(x_j\ge x_i+2\) 就再需要 \(W_{i,j}\) 代价,等等。

然后跑个 flow 就行了。

2024.1.17

A

先算出来 \(f(i,j)\) 表示 \(i\) 个数 \(\max =j\) 的方案数,再算出来 \(g(i,j)\) 表示 \(i\) 个数,而且前面已经有一个 \(j\) 了,后面随便填的方案数。有

\[f(0,0)=1,f(i,j)=f(i-1,j-1)+j\times f(i-1,j)\\ g(0,\cdot)=1,g(i,j)=g(i-1,j+1)+j\times g(i-1,j) \]

枚举一个 \(t\) 算贡献,枚举其第一次出现位置 \(i\),再枚举出现次数为 \(k+1\),贡献就是

\[f(i-1,t-1)\times g(n-i-k,t)\times (k+1)^2\times \binom{n-i}{k} \]

于是一个 \(t\) 的贡献为

\[\sum_{i=1}^nf(i-1,t-1)\sum_{k=0}^{n-i}g(n-i-k,t)\times c_k\times \binom{n-i}{k}\\ \]

其中 \(c_k\) 是容斥系数。这里我们只是钦定了后面的 \(n-i\) 个里面有 \(k\) 个是 \(j\),我们希望

\[(k+1)^2=\sum_{i=0}^k\binom{k}{i}c_i\\ c_i=\sum_{j=0}^i(j+1)^2\binom{i}{j}(-1)^{i-j} \]

解的 \(c=(1,3,2,0,0,\cdots)\),于是 \(k\) 只需要枚举 \(3\) 项。总复杂度 \(O(n^2)\)

B

这个题有点呃呃了

题目相当于给了一个 DAG,需要计数拓扑序。每次询问相当于把若干个点缩到一起。

那么如果这些点顺序不对或者缩完有环肯定就寄了,否则可以直接 dp。

写了一个记搜直接斩获 \(85\),主要原因是这个题的边数比较多,状态数很少。注意到极限情况下图不太连通,因此每个连通块分别做之后写个组合数合并,就飞快地跑过去了。

C

把修改和询问都离线,维护 \(p_i\) 表示想要覆盖 \(i\),至少需要 \(l\le p_i\)

那么相当于区间 checkmax,查询全局 \(\ge L\) 的元素个数。

考虑值域维度维护一个 BIT,然后序列维维护线段树,segbeats 一下就是 \(O(n\log^2n+q\log n)\)


[数据删除]

[数据删除]

[数据删除]

[数据删除]

2nd Ucup stage18 : Dolgoprudny

I

先只保留 \(2\) 跑一遍 tarjan scc,算出来每个点是否可行;再两种边都保留,算出来 \(1\) 能否到一个可行点。

G

考虑对 \(d_i=a_i-2a_{i-1}\) 计数,这里认为 \(a_0=0\)。那么需要满足 \(d_1\ge 1,d_i\ge 0\),而且 \(a_n\le c\)

注意到 \(a_n=\sum_{i=1}^n2^{n-i}d_i\),考虑数位 DP,从低到高填 \(d\),设 \(f(i,j,0/1/2,0/1)\) 表示填到第 \(i\) 位,当前积攒了 \(j\)\(1\),和 \(c\) 的大小关系是 \(>/=/<\)\(d_1\) 是否有非零位的方案数。

转移有两种,当 \(i\le n-2\) 时,\(d_1\) 这一位上一定是 \(0\)。于是对于 \(i<n-2\) 有:

\[f(i,j,p,0)\times \binom{i+2}{k}\to f(i+1,\lfloor(j+k)/2\rfloor,q,0) \]

其中 \(p\to q\) 取决于 \((j+k)\) 的奇偶。对于 \(i\ge n-2\)

\[f(i,j,p,x)\times \binom{n-1}{k}\to f(i+1,\lfloor(j+k)/2\rfloor,q_1,x)\\ f(i,j,p,x)\times \binom{n-1}{k}\to f(i+1,\lfloor(j+k+1)/2\rfloor,q_2,1) \]

表示特别讨论 \(d_1\) 这一位上是否为 \(1\)

F

显然一旦正经走完就不会随机了。考虑先 BFS 算出 \(f_i\) 表示 \(i\)\(0\) 不随机的最短路。

接下来的策略感受一下,一定是设定一个目标值 \(tar\),先随机若干次直到 \(f_x\le tar\),然后再走 \(f_x\) 步直接启动。

枚举 \(tar\) 解一下期望步数即可,复杂度 \(O(NK+N\log N)\)

D

考虑枚举选择的 \(a_p\),从大到小枚举。把包含的区间都去掉,那么区间的 \([l,r]\) 将同时递增。

那么加入一个 \(a_p\) 就是区间 \(+1\),查询就是区间 max。线段树维护即可。复杂度 \(O((n+q)\log n)\)

2024.1.15

A

考虑给定一个序列怎么算本质不同子序列个数:\(f_{i,j}\) 表示前 \(i\) 个数,最后一个数 \(=j\) 的本质不同子序列个数。

那么每次就是对 \(j\neq a_i\)\(f_{i,j}\leftarrow f_{i-1,j}\),然后 \(f_{i,a_i}\leftarrow \sum f_{i-1,j}\)

那么现在改成对区间等概率操作,发现对 \(f\) 都是 \(f_j\leftarrow A\times f_j+S\) 的形式,其中 \(S=\sum f_{i-1,j}\)

然后做 \(c\) 次操作无非是这个东西复合,发现 \(S\) 的影响也是 \(S\leftarrow B\times S+C\) 的形式,这里 \(A,B,C\) 均为常数。

于是倍增复合这些操作即可,其实也就是矩阵快速幂。

B

我真服了怎么这个都不会,可能是一开始看错题了然后就始终以为需要 \(\text{poly}(2^k)\) 的复杂度。。。

相当于删掉尽可能少的黑点,使得不存在一个 \(0,1,2,\cdots,k-1\) 的路径。

考虑在子序列自动机上 DP,\(f_{i,j}\) 表示当前在第 \(i\) 行,下一个要走 \(j\) 的最小代价。

考虑转移:\(f_{i-1,j}\to f_{i,k}\) 需要 \((i,j),\cdots,(i,k-1)\) 全是 \(1\),然后如果 \((i,k)\) 这里是 \(1\) 就需要把他干掉。

于是这里就有一个矩阵了,做 min+ 矩乘即可。

但是我们有可能是只保留一段,那同样设 \(f_{i,x,y}\) 表示能走 \(x\to y-1\),走不到 \(y\) 的最小代价。

发现转移形如 \(f_{i-1,x,y}\times G_{y,z}\to f_{i,x,z}\),这也是矩乘。

于是直接做就行了,复杂度 \(O(nk^3\log n)\),空间直接就是 \(O(nk^2)\)。题解在扯啥啊真弱智

C

和 CF932G 一样的做法。

但是暴力乱过,耶。

相等树链

考虑对第一棵树点分,当前分治中心为 \(x\),那么两棵树上路径都要经过 \(x\)

把当前分治块内的点在另一棵树上找出来,发现不和 \(x\) 连通的肯定寄了,剩下的形成一个大小不超过分治块的连通块。考虑怎么判断这边的两个端点 \(p,q\) 在那边是否仍然是一条链,发现需要 \(x\to p,x\to q\) 在那边能拼起来。

考虑啥时候能拼起来,令 \(S_p\) 为左右两侧 \(x\to p\) 的集合的对称差,发现能这样当且仅当路径经过 \(x\),而且需要满足 \(S_p=S_q\)。考虑 xorhash,然后在另一边只需要依次考虑每个儿子,把那边的子树插入即可。

如果把哈希表的复杂度看作 \(O(1)\),总复杂度就是 \(O(n\log n)\)

ARC118F

咦我上场 ucup 刚做过这玩意。

\(d_i=X_{i+1}-A_iX_i\ge 0\),对 \(d\) 计数,那么相当于 \(\sum_{i=1}^Nd_i\times \prod_{j\ge i}A_j\le M\)

\(B_i=\prod_{j\ge i}A_j\),那么 \(B_{i+1}\mid B_i\),答案即为

\[[x^M]\frac{1}{1-x}\prod_{i=1}^N\frac{1}{1-x^{B_i}} \]

考虑从后往前做,先考虑一开始的 \(\frac{1}{1-x}\),它的系数形如 \((1,1,1,\cdots)\)

考虑卷上一个 \(\frac{1}{1-x^{B_i}}\),发现相当于隔 \(B_i\) 项做前缀和,也就是 \(f_j\leftarrow f_j+f_{j-B_i}\) 这样去做。

那先考虑 \(B_N\),发现只有 \(j\equiv M\pmod{B_N}\)\(f_j\) 有贡献;进一步由于 \(B_{N-1}\)\(B_N\) 的倍数,因此如果这一步 \(j\) 已经无法对 \(M\) 造成贡献了,下一步肯定仍然无法造成贡献。

The 2nd Ucup Stage 19

下午七点才睡醒,捆包单挑 3h,我错了/ll

B

现在是琪亚娜时间!打表找规律发现:(为了方便写作 0-indexed)

  • 最后 \(m\) 位从第一个长度 \(\ge m\) 的串开始出现以 \(2\) 为循环节的循环。

注意 \(m<10^6\),处理到前两个长度 \(\ge 10^6\) 串即可停止。

G

瞎编了一通就过了

C

每个非叶子节点相当于一个区间 \([l,r]\),要求区间内的 R 个数在 \([\lfloor \frac{L}{2}\rfloor,\lceil \frac{L}{2}\rceil]\) 之间。其中 \(L=r-l+1\)

这个可以直接跑差分约束,但是肯定有负权边,但是感觉这个范围直接 spfa 就过了啊

ARC170

C

\(f(i,j)\) 表示前 \(i\) 个数,目前已经填进去 \(j\) 种数。

  • \(a_i=1\)\(f(i,j)\to f(i+1,j+1)\)
  • \(a_i=0\)\(f(i,j)\times j\to f(i+1,j),f(i,j)\times (M-j)\to f(i+1,j+1)\)

D

先把 \(A,B\) 排序。设第一步选的是 \(A_i\),第二步选的是 \(B_j\)。分两种情况讨论:

  • \(A_i>B_j\):这种情况下 Bob 想要让 \([A_i-B_j+1,A_i+B_j-1]\) 这个区间内没有 \(A\) 的数,显然应该取 \(B_1\)
  • \(A_i\le B_j\):这种情况下 Bob 想要让 \([B_j-A_i+1,B_j+A_i-1]\) 这个区间内没有数。这里我们先暂且允许 Alice 选两次 \(A_i\),在这种情况下如果选 \(A_i\) 会让 Bob 赢,那么选一个 \(x<A_i\) 也会让 Bob 赢。这是因为 \(B\) 的候选集合变大了,但是区间缩小了,Bob 维持原选择不变即可。
  • 再考虑 Alice 不能把一个数用两遍这个限制,发现这可能会导致,一个前缀 Alice 必败,后面突然又出现了若干个必败点,也就是选完 \(A_i\) 之后,存在一个 \(B_j\ge A_i\) 使得 \([B_j-A_i+1,B_j+A_i-1]\) 这个区间内只有 \(A_i\) 一个数。那么相当于 \(2A_i>B_j\ge A_i\),发现如果一个 \(A_i\) 这样必败了之后,其他的 \(A_j>A_i\) 至少需要 \(\ge 2A_i\)。也就是说这样的必败点不超过 \(O(\log V)\) 个。
  • 因此如果剩下的 \(A\) 不超过 \(40\) 个我们暴力 check 每个是否寄了,否则直接输出 Alice 必胜即可。

QOJ8107

大战一下

大战失败

好哥哥会了教我好吗/kel

posted @ 2024-01-07 20:34  云浅知处  阅读(281)  评论(2编辑  收藏  举报