SDOI二轮省集

Day1

T1

打出 \(n^2\) dp,找到规律,直接计算。

可以用导数证明公式

T2

T3

愚蠢的在线法官

我会 \(n^3\)

\(A_{a,b}=f_{lca(a,b)}\rightarrow A_{a,b}=w_x[a|x][b|x]\)

\(w_x\) 可以树上差分由 \(f_x\) 得到。

一个点对矩阵的 \(i\in[l,r],j\in[l,r]\)\(l,r\) 是子树 dfn 序)有矩阵加,矩阵上二维差分不影响行列式,所以变成了四个单点加,发现是矩阵树的形式。

转化为求 \(l,r+1\) 间连边的生成树数量,用广义串并联图求生成树的方法求生成树得到矩阵的行列式。

匹配计数

对每一个颜色赋一个权值,要求 \(3\) 变成了要求有偶数个逆序对,于是对每对逆序对连边,要求导出子图的边数为偶数。

要求 \(2\) 则利用“偶减奇”的套路,对每种颜色额外连一个源点,若颜色数为偶数则会贡献翻倍,否则贡献为 \(0\)

把边写成邻接矩阵的形式,用 bitset 进行消元计算边数偶数的导出子图,复杂度 \(O(\frac{n^3}{w})\)

Day2

T1

\[(a^\frac{t(p-1)+1}{k})^k=a \]

所以 \(x=a^\frac{t(p-1)+1}{k}\),令 \(t\)\(p-1\) 在模 \(k\) 意义下的逆元,得到答案。

也可以算 \(k\) 在模 \(p-1\) 意义下的逆元。

T2

四毛子科技。

把每个序列分成大小为 \(B\) 的块,记录每个块的超集有谁,那么答案就是所有块的超集的与,可以用 bitset 优化,复杂度 \(O(n\cdot\frac{n}{B}\cdot\frac{n}{w})\)

每个块内的超集怎么求呢?暴力枚举集合即可,把集合中的数的超集与起来,复杂度 \(O(\frac{n}{B}\cdot 2^B\cdot\frac{n}{w})\)

T3

转啊转啊转(bzoj4634)

Day3

T1

\(k=1\) 时可以 \(O(nk)\) 找规律前缀和递推,\(k=2\) 时答案为 \(1\)

\(k>2\) 时,求 \(k\) 不被染色的概率,用 \(1\) 减去,\(k-1,k\) 被选中时一定不合法,不需要管。

把染色操作看做随机排列,从前往后能染就染。剩下的染色操作分为两部分,左半边和右半边不互相影响,发现左边的概率就是 \(1\) 减去 \(i=k\) 时的概率,右边的概率就是 \(1\) 减去 \(i=n-k+1\) 时的概率,因为是概率,两边可以直接乘起来。

T2

要孤立点尽量少的前提下二度点尽量少,给每个点连两条边,一条的费用是 \(-\infty\),另一条的费用是 \(1\),跑最小费用最大流。

边权只有 \(-2\infty\)\(-\infty+1\) 两种,模拟费用流,先跑第一种,再跑第二种,用 dinic 可以做到 \(O(n\sqrt m)\)

T3

QOJ4549

Day4

T1

T2

T3

Day5

T1

首先距离有最大值和最小值,此外还有奇偶性的要求。

这三个条件是充要的,考虑怎么删障碍是合法的。对于每个中间联通块,随意选择中心,优先删最远的的障碍,发现一定合法,并且对答案的贡献是 \(-2\)\(0\)。连在边界上的联通块则可以把整个边界看做中心,还是优先删最远的。

预处理处删除序列,二分答案,时间复杂度 \(O(RC\log(RC))\)

T2

T3

Day6

T1

贪心,优先选没被覆盖的 lca 深度最大的链,覆盖它的 lca,并且把被覆盖的链删掉,树剖 + 树状数组 \(O(n\log^2 n)\)

差分为子树修改单点查询,复杂度 \(O(n\log n)\)

T2

倒序枚举点,设 \(f_{i,j,k}\) 表示点数为 \(i\),连通块个数为 \(j\),还需要接一个点的二度点数为 \(k\)

\(0\) 出度点可以作为新的连通块,或者接到二度点上,两种情况。

\(1\) 出度点要连一个已有的连通块,同时可以接到二度点上,两种情况。

\(2\) 出度点可以连两个已有的连通块,连一个已有的连通块,同时也可以接到二度点上,四种情况。

T3

考虑 \(\sum\limits_{i=1}^m \binom m i f(i)\) 的组合意义,指的是在 \(m\) 个点中选 \(i\) 个点激活的贡献,从左到右枚举,每个点有两种状态,激活或者不激活。

\(a\) 前面可以接 \(a,b,c\)\(b\) 前面可以接 \(b,c\)\(c\) 前面可以接 \(a,b,c\)

写出递推式,发现可以矩阵快速幂加速递推,时间复杂度 \(O(T\log m)\)

[省选联考 2023] 人员调度

带删除一眼鉴定为线段树分治,所以考虑只加入怎么办。

假设刚开始每个位置上都有一个贡献为 \(0\) 的人,对于一个新加入的人,如果更优,他可以换掉子树中最小的人,然后那个人再换掉他的子树中最小的人,直到打不过为止。

这样复杂度一定爆炸,所以我们抽象一下,假设是这一个人直接抢走了最后一个被踢走的人的位置,那么就是向上找到第一个子树中所有员工没有来自子树外的,换掉这个子树中的最小值,同时要记住这个人原来来自哪里,便于进行撤销操作。

换人和找点都可以用树剖 + 线段树来维护,时间复杂度 \(O(n\log^3 n)\)

Day7

T1

根据生日悖论,我们只要有足够多的树就大概率能凑出答案。

看样例,发现 \(26\) 的父亲一直是 \(1\),想到把一棵树拆成两半,这样枚举树的效率会更高,用 unordered_map 存下第一棵树的值,用第二棵树的值加上两边的贡献去找答案。

T2

扩展一下哥德巴赫猜想,所有大于 \(8\) 的偶数都能被拆成两个不同质数的和。

选择两个质数,用小的不断加,然后用大的减,因为两个质数互质,剩余系能取到所有的数。

\(n\) 是奇数也简单,由于是一个成环的剩余系,最后一步一定还能跳到 \(1\),而 \(n+1\)\(1\) 本质相同,所以一定也能跳到。

T3

arc161e

比较神仙。

考虑不合法的状态比较多,可以打表看出来(也可以看题解),想到随机答案,然后 check 是否合法。

由于是黑白染色,想到 2-SAT,不好直接搜,把每个点拆成黑白点,按照支配条件连边,然后缩点,如果同一个点的黑白点在同一个联通块里,那么成功找到不合法的。

输出 \(-1\) 就是骗人的。

[JOISC 2023 Day3] Tourism

回滚莫队 + 虚树 + \(O(1)\) lca 强行三合一

Day8

T1

先把所有已经匹配的数删掉,然后剩下 \(4\) 种数,确定的 \(1\),不确定的 \(1\),确定的 \(-1\),不确定的 \(-1\)

dp 式子好推,但是注意不确定的 \(1\) 和不确定的 \(-1\) 之间的匹配要乘上额外系数,总共是一个阶乘。

T2

显然 \(D=\lceil\frac{L}{2}\rceil\),考虑计数。

先做直径为偶数的情况,给每个点一个点权,有 \(u\rightarrow v\)\(w_v-w_u=1\),固定一个点权值为 \(0\) 则点权与方案形成双射,发现 \(d(u,v)=(dist(u,v)+w_u-w_v)/2\),移项可得 \(|w_u-w_v|\le L-dist(u,v)\)

令距离中心 \(m\)\(D\) 的点权值为 \(0\),则 \(|w_u|\le D-dist(u,m)\),可以直接树上 dp。

如果直径为奇数,找到两个中心 \(m_1,m_2\),对 \(m_1\)\(m_2\) 分别做 dp。因为可能有交集,向上和下分别压 \(1\) 的边界,减去交的部分,得到答案。

T3

[省选联考 2022] 卡牌

没见过的套路。

显然不能多项式做法,发现值域比较小,可能与状压有关。

然后就没有思路了,看题解发现可以根号分治,对于小质数状压,不可能同时出现的大质数控制的数相互独立,所以可以分别计算,容斥一下,钦定不能出现某些小质数,对于每个大质数来说是好算的,乘起来就好。

[Cnoi2019]人形演舞

第一眼看出来是公平博弈,所以一定与 SG 函数有关,打一个表,发现 \(i\) 的 SG 函数是 \(i-highbit_i+1\)

然后考虑怎么计算答案,每一个位置的贡献是一样的,并且转移方式是异或卷积,所以记录 SG 函数为 \(i\) 的数有多少,然后 FWT,对于每个数快速幂,最后 IFWT,记得费马小定理降幂。

[JOI Open 2022] 放学路(School Road)

神仙题,计算有没有距离为非最短路的从 \(1\)\(n\) 的路径

首先发现如果有一个不同时包含 \(1\)\(n\) 的点双是一定不会走进去的,所以想办法找到有用的点,在 \(1\)\(n\) 之间再连一条边,就可以通过点双找到有用的点。

在新图中,一度点显然无用,二度点只有一种走法,可以缩成一条边,长度相同的重边和一条边的作用是一样的,缩成一条边就可以了,两条不相同的重边对答案有贡献,变成一条有标记的边。

最后答案是 \(0\) 当且仅当 \(1\)\(n\) 之间只有一条没有标记的边,说明不管怎么缩都是唯一路径,否则一定有其他方案,可以画一个四个点的图验证一下。

Day9

T1

树上 dp,转边权为点权,设 \(f_{i,0/1}\) 为第 \(i\) 个点颜色是 \(0/1\) 的方案,转移时要继承一个同色儿子,其他儿子的贡献是深度乘积,并且两个子树拼起来的贡献是简单组合数,最后再乘上点权。

T2

对于每个起点,显然只有 \(O(\log V)\) 个转折点,总共有 \(O(n\log V)\) 个转折点,对于一次询问的每个起点,人会在区间中每个转折点掉头,然后直到下一个转折点在区间外,走到区间端点后回头,直到另一个端点。

首先考虑怎么找到所有转折点,假设现在找右边的转折点,并且我们已经知道上一个转折点 \(x\) 和上上个转折点 \(y\) 在哪里,那么找到在 \(y\) 右边并且距离 \(x\) 小于等于指定距离的点 \(z\)。移项,不等式一边留下与 \(z\) 相关的值,用 st 表预处理,二分找到转折点。

接着考虑怎么计算答案,记录每个关键点会作为哪些区间的左端点之外的点,会作为哪些区间的右端点之外的点,会是哪些区间中的转折点。由于对左端点和右端点都有要求,所以相当于一个二维数点。贡献可以简单算。

T3

强行状压肯定行不通,考虑怎么精简状态。

由于只关心 \(x\)\(r\) 的相对关系,考虑记录 \(x\)\(r\) 的 lcp \(j\),以及 lcp 后面的 popcount \(k\),转移分四种。

操作是加,并且 \(k\) 的 popcount 没满,会导致 \(k\) 加一。

操作是加,并且 \(k\) 的 popcount 满了,会导致 lcp 变短,可以预处理。

操作是减,并且 \(k\) 大于 \(1\),会导致 \(k\) 减一。

操作是减,并且 \(k\) 等于 \(1\),可能会导致 lcp 变长,可以预处理。

操作是减,并且 \(k\) 等于 \(0\),可能会导致 lcp 变短,可以预处理。

因为是多点询问,前后 dp 预处理,然后把前后拼起来就行了。

[EGOI2022] Lego Wall / 乐高墙

\(n\times m\le 5\times 10^5\),考虑根号分治。

算法一:设 \(f_{i,j}\) 为枚举到 \(i\)\(i-1\)\(j\)\(1\times 2\) 的左半边,枚举 \(i\)\(k\)\(1\times 2\) 的左半边,组合数转移,复杂度 \(O(nm^2)\)

算法二:容斥,设 \(h_i\)\(m\times i\) 填满的方案数,每行独立,是斐波那契数列,乘起来即可。\(g_i\)\(m\times i\) 是一个联通块的方案数,钦定最后一个联通块是 \(j+1,i\) 之间,贡献是 \(g_{i-j}\times h_j\),用 \(h_i\) 减去即可。

Conference Problem

Density of subarrays

posted @ 2023-05-25 14:58  mikefeng  阅读(150)  评论(0)    收藏  举报