梦熊省选模拟赛

模拟赛

Posted by WrongAnswer_90's Blog on January 5, 2025

Day 5

T1

先求离散对数,可以做到 $\mathcal O(\sqrt(n\times MOD))$。

然后就变成了区间加,查区间 $\gcd$。答案是 $\frac{p-1}{\gcd(a_l,\dots,a_r,p-1)}$。

我擦怎么过不去!!!

考虑你只关心他怎么干掉一个 $p-1$ 因子。所以只需要求出他们的阶的 LCM。阶可以暴力求。

T2

考虑所有 $\leq m$ 的点,他们形成了若干个连通块。容斥预处理大小为 $i$ 的连通图数量 $f_i$。

然后对于 $>m$ 的点,他最多只能连接一个联通块。这样就可以随便预处理出 $g_{i,j}$ 表示 $i$ 个 $\leq m$ 的点,$j$ 个 $>m$ 的点构成的一个合法连通块数量。

然后对 $\hat G$ 做一个 $exp$ 即可。学习了一下二元生成函数 exp,所以暴力可以做到 $\mathcal O(n^3)$,可以 FFT 就能做到 $\mathcal O(n^2\log n)$。

T3

$n$ 个 $k$ 位二进制数异或和为 $0$ 的方案数是 $2^{k(n-1)}$。

考虑如果只有一行怎么做。$f_i$ 表示 $i$ 个互不相同的数异或和是 $0$ 的方案数。转移是 $f_i=(2^{k})^{\underline{i-1}}-f_{i-2}(i-1)(2^i-(i-2))$。

加入了第二行,假设第一行比第二行长,考虑枚举有 $i$ 列上下相等,先确定这 $i$ 列的取值:$(2^k)^{\underline i}$。然后方案数是 $(2^k-i)^{\underline{n+m-2k-1}}$……吗。不是。因为你的最后一个数可能会和这 $k$ 列钦定的相等。

既然容斥不大好做,那就直接正着计数。钦定第一行互不相同,然后对于第二行考虑他们是否和第一行的某个数相等。考虑计算 $g_{n,m}$ 表示 $n$ 个数的排列,其中前 $m$ 个数不能和自己相等,其余任意的方案数。

考虑从 $g_{n,m}$ 推到 $g_{n,m-1}$,若 $p_m=m$ 则可以把它删掉后方案数是 $g_{n-1,m-1}$。所以 $g_{n,m-1}=g_{n,m}+g_{n-1,m-1}$。

对于 $g_{n-1}$ 怎么递推。从 $g_{n,m}$ 里考虑 $p_m=x$,若 $p_x=m$,删掉 $p_m$ 之后,分 $x<m$ 和 $x>m$ 讨论,则方案数是 $g_{n,m}=(m-1)g_{n-1,m-2}+(n-m)g_{n-1,m-1}$。所以考虑维护二环组 $(g_{n,m},g_{n-1,m-1})$。这样可以 $\mathcal O(1)$ 推出 $g_{n-1,m-2}$ 和 $g_{n,m-1}$。复杂度 $\mathcal O(n)$。

Day 6

什么傻逼场

T1

先判掉 A 能一步秒 B 的情况。

首先一个人的斩杀线是 $mx+rg$。容易发现斩杀线大的人一定不会输。

然后判一下斩杀线大的人能不能把他杀掉。如果他 $mv$ 大于另一个人的那就可以把两者的距离削减到 $mv2+rg2+1$,只需要判 $mv1+rg1\geq mv2+rg2+1+mv2$ 即可。否则两者距离可以削减到 $\max(mv2+rg2+1,d-mv1)$,判 $mv1+rg1\geq d+mv2$ 即可。

T2

有病。

爆搜。

T3

我很唐啊感觉。

你得先把这个构式一样的题意读懂。考虑每个人先向 $b_{i,1}$ 连边,这是个外向基环树,取出所有环,环上的方案确定了。然后剩下的点继续选 $b_{i,2}$。

这样就是若干个环形成的一个 DAG。DAG 计数就是每次剥零度环,他向其余点可以连边,连了 $j$ 条边方案数就是 $j!(n-1-j)!$。

Day 7

T1

考虑值域从小到大放。状压记录当前 DP 数组的差分值以及上一个关键值在哪里。复杂度 $\mathcal O(2^nn^2)$。

T2

考虑枚举值域 $[x,x+d]$,一个区间不合法就是即出现了 $<x$ 的也出现了 $x+d$ 的并且不出现 $[x,x+d]$ 之间的。

从小到大枚举 $x$,每次变大的时候会更新一个不合法的矩形,然后就变成了矩形查矩形面积并状物。

T3

首先 $2\vert m+1$。然后考虑对于一种颜色,当前 $n$ 个点会有若干个匹配,设有 $p$ 个,则剩下了 $n-2p$ 个单点。所以需要 $n-2p\leq m+1-n$ 即 $n-p\leq \frac{m+1}{2}$。这样就只需要 $n\rightarrow n+1$。

加入一个点之后,考虑建一个二分图,左侧是颜色,右侧是点 $[1,n]$,如果 $j$ 点旁边没有 $i$ 颜色那就连边 $i\rightarrow j$。还有对于颜色 $i$,如果 $2n-2p_i<m+1$ 就 $i\rightarrow T$,否则不连。

Day 8

T1

我好菜。

大力化简式子可以得到贡献是 $x^2+y^2+z^2-2xy-2xz-2yz$。注意到如果确定了 $x,y$ 之后,第三条边一定越接近 $x+y$ 越好。

考虑分治优化 DP。如果左侧选两个点右侧选一个,对于最靠左的一个 $i$,若在 $[i,mid]$ 中选的是比他小的,那一定选比他小的最大的。如果比他大,假设选了 $x>j>i$,那 $(i,x)$ 一定不如 $(j,x)$ 优秀。右侧同理。李超树或者单调栈维护。

T2

比较唐。不想写。

T3

我超,原。

Day 9

T1

扫值域好像就做完了。但是基于扫序列也有个单调栈做法。扫右端点 $r$,维护每个 $i$ 对应的最大的 $l$。维护一个从栈底到栈顶单增的单调栈,这样一个单调栈区间,只有最左端点可能还有贡献,每次弹的时候更新一下就行了。

T2

考虑建出广义后缀自动机,在后缀树上启发式/线段树合并维护每种颜色的出现次数。一旦出现次数超过了 $a_i$ 那他就是 $1$,否则是 $0$,维护这个的哈希就行了。一个点 $i$ 的贡献次数是 $(len(i)-len(fa_i))\times val_i$,$val$ 是子树内查询串的出现次数。

然后线段树维护区间 rev 区间哈希啥的。

T3

算了吧。

Day 10

T1

枚举平移长度 $d$,扫一遍是可以算出来要修改多少个位置的。需要一个加数,删数,查众数。

T2

烂。

考虑离线怎么做:启发式分裂,每次若干个区间 chkmin。强制在线就是倒过来。因为 chkmin 的连续段数是 $\mathcal O(n)$,所以取消 chkmin 后暴力找连续段的复杂度也是 $\mathcal O(n)$ 的,好像还需要一个树套堆维护一下。

T3

首先猜测 $d_b>d_a$ 那 bob 一定赢。