最后
houzhiyuan
·
·
个人记录
2023.3.25 距离联合省选 2023 还有一周。
不知道这是否会成为旅途的终点。
NOIP 失利之后,我跌跌撞撞走到了这里。
现在反而没那么紧张了。
我为这个梦想已经付出了太多太多。
我的 OI 不会被 T1 没换行的这 100 分而击倒的。
最后一周了,不想做题,也做不动了,复习一下前面做过的题,当个杂题选做好了。
一些要记着用的东西:
-
克鲁斯卡尔重构树
-
哈希
-
笛卡尔树
-
支配对
-
2-sat
-
网络流
-
bitset
-
卷积(集合、\gcd 等)
联合省选 2022 D1T1
简单模拟题,把字符串存下来然后搜索即可。
标识符和任意 ASCII 的区别比较丁真,多读几遍应该没啥问题。
但这种题很阴间啊,因为不能对拍,还是应该自己造几组。
联合省选 2022 D1T2
把一组 (\max,\min) 放在 \max -k 上去统计贡献,那么相当于对于每个 i 求出所有区间都在 [i,i+k] 的方案,然后容斥一下减去 [i,i+k-1] 的方案。
然后考虑一下选出一条链后,每一个区间对于每个 i 的贡献是一个分段函数,可以分成三段。
复杂度 $O(n^3)$,小卡常。
小技巧:多次 dfs 可以改成先 dfs 一次记录 dfs 序,后面就不用递归了,这样会快很多。
### [联合省选 2022 D1T3](https://loj.ac/p/3702)
不会,感觉是流。
大概会了,没代码。
先考虑性质 C,也就是所有上下组合给的贡献相同。
就是考虑由于要连成一条链,所以每个点一个出点一个入点,然后去跑二分图匹配,唯一的问题在于可能会出现环。
重要的条件是**每个人都会有一条学术消息**,因此在前面或者后面补上就可以破环。
没有性质 C,证明一下得到不满足性质 C 的边一定匹配最优。
怎么说,感觉就是顺着思路,然后瞎证明一下的题,看来还是比较需要勇气。
### [联合省选 2022 D2T1](https://loj.ac/p/3703)
把每个素数看成是二进制一位,那么 $<\sqrt{a_i}$ 的可以状压,然后 FWT 一下,没啥意思。
大样例很弱啊,还是要对拍。
### [联合省选 2022 D2T2](https://loj.ac/p/3704)
建出括号树,贪心从上向下。
$y=1$ 的部分是简单的,直接贪,用 set 维护。
$y\ne 1$ 的情况讨论一下所有数都在同一层的情况,发现转移到下面一层有贡献的只有最大值和最小值,中间的可以乱选。
但是只有两个数时需要特殊考虑。
总而言之是丁真分讨题,讨论仔细一点就好了。
### [联合省选 2022 D2T3](https://loj.ac/p/3705)
对于每个子树,考虑对上面的贡献,显然是上面下来一条链,还有这个子树给外面的贡献,设到状态里,可以得到一个三维 dp,转移直接大力讨论那条边先选即可。
暂时只会这样的 $O(n^3)$,有 $44$ 分,考场上可能最多也就写到这里了。
这样的状态只需要记录下面一条链到那个点,这样就可以把空间变成 $O(n^2)$ 了,可以过多一点。
最后的不想想了,太精神污染了。
### [ABC295Ex](https://atcoder.jp/contests/abc295/tasks/abc295_h)
忍不住新开了一个题。
一列一列 dp,记录上面到下面前缀还有那些列活着,记录到状态里。
然后轮廓线 dp,要么是上面有,要么是左边一个前缀。
$O(nm2^m)$,滚动数组一下空间是 $O(2^m)$。
卡常小技巧:有多维数组,把小的放到前面会变快(显然)。
然后 vector 每次重新定义 < 枚举每一个赋值 < memset。
### [CF1798F](https://codeforces.com/contest/1798/problem/F)
不会做题了。
用 [uoj771](https://uoj.ac/contest/79/problem/771) 的结论,任意 $2n-1$ 个数总能凑出 $n$。
那么把 $s_i$ 从小到大排序,然后前面的都可以暴力 dp 凑出,最后剩下的差多少就补多少即可。
### [loj 6406](https://loj.ac/p/6406)
直接考虑第 $i$ 个人增加了 $a_i$ 的概率,这个是
$$
\frac{\binom{n}{a_1,a_2,...,a_n}a_1!a_2!...a_n!}{\frac{(n+d-1)!}{(n-1)!}}
$$
注意到这是个定值,所以所有方案概率都一样,算出总方案和总概率即可。
一个人一个人 dp 比较困难,考虑一行一行 dp,设 $f_{i,j}$ 表示用了 $i$ 个,还有 $j$ 个人继续的方案数。
概率期望题能不能给个模数啊。
### [nadafes2022_day2_e](https://atcoder.jp/contests/nadafes2022_day2/tasks/nadafes2022_day2_e)
两维问题,直接考虑去独立。
$$
\min(|x_i-x_j|,|y_i-y_j|)=|x_i-x_j|+|y_i-y_j|-\max(|x_i-x_j|,|y_i-y_j|)
$$
然后后面那个转坐标就两维独立了,独立后就是简单的计数问题。
### [abc221G](https://atcoder.jp/contests/abc221/tasks/abc221_g)
依然考虑两维独立,会发现现在已经独立了,要让他们合并做比较好,那么原来的左边是一个十字,现在转成一个 X,这样两维不影响,分别做即可。
bitset 一下。
### [AGC056B](https://atcoder.jp/contests/agc056/tasks/agc056_b)
好难,网上的题解写的都比较问号。
本质是一个映射,但是网上题解所说的字典序最小对应没看懂有啥用。
就是考虑这个东西如果确定了一个区间最大值,那么就把区间分成两半,唯一的问题在于可能会有重复,所以选出的这个最大值是有要求的。
我们对于一个 $x$ 序列这样构造:每次在所有被区间包含的,所有可以放的里面,选最小的那个位置去放。
既然被区间包含,那么必然需要一个区间来限定这是最左边方案,也就是说需要一个区间包含这个点和他左边的最大值,而右边可以乱填。
然后区间 dp 即可,记录 $f_{i,j,k}$ 表示区间 $[i,j]$ 中,最大值位置为 $j$ 的方案,前缀和优化即可。
### [CF1732D2](https://www.luogu.com.cn/problem/CF1732D2)
神秘复杂度题。
首先考虑没有删除,那么直接开 map 记录每个点有没有被删,然后暴力跳即可,如果多次询问同一个 $k$,那么就从上一次停下的地方继续走,复杂度应该是单 $\log$。
然后带删除,一直在想线段树分治,但是没啥用啊。
考虑如果把 $k$ 经过的点上去放一个 $k$,如果删去一个点就记录一下,然后询问 $k$ 的时候先看看前面有没有被删去的点,否则继续前进。
复杂度不知道。
### [联合省选 2021 D1T2](https://loj.ac/p/3500)
直接构造比较困难,考虑先搞出一个不符合 $[0,10^6]$ 的方案,然后来调整。
调整,会发现一行把第 $i$ 个元素加上 $(-1)^i$ 后,依然满足条件。
因此设第 $i$ 行操作 $a_i$ 次,第 $j$ 列操作 $b_j$ 次,就可以列出不等式,然后改一下就可以差分约束了。
### [联合省选 2021 D1T3](https://loj.ac/p/3501)
从小到大删点,可以发现如果 $(u,v)$ 中途需要经过 $x$ 满足 $x<v$,那么 $x$ 一定在前面就被删掉了,因此相当于 $u \to v,v\to u$ 上经过的点都要求 $\ge v$。
简单的想法是直接 Floyd,每次加一个最小的点,复杂度 $O(n^3)$。
然后考虑边数比较小,枚举 $v$,相当于只保留 $[v,n]$ 的点,然后最短路,可以 dij 做到 $O(nm\log m)$。
考虑动态加边然后维护可行性,这个也比较简单,只有当前边会产生贡献的时候再去跑 bfs 即可,总复杂度 $O(nm)$。
### [[ZJOI2012]灾难 ](https://www.luogu.com.cn/problem/P2597)
复习一下支配树,这个是 Dag 部分。
先建一个超级源点,连向所有入度为 $0$ 的点,这样支配变成了 $1$ 到 $v$ 的路径必须经过 $u$。
首先支配关系形成一棵树,若干个支配对会形成一条链,因此一定没有环。
考虑 dag 上咋做,那就拓扑排序,只需要找到支配一个点的深度最小的那个点即可,那么建出前面的支配树,然后加一个点就相当于对于所有它的入度点求个 lca,然后挂在它下面。
加点求 lca 可以倍增。
### [联合省选 2021 D2T3](https://loj.ac/p/3504)
支配形成树,先建出来。
然后考虑加一条边,那么显然是一个点 $u$ 的被支配集变小了。
也就是说可以通过其他路径走过来,不经过 $u$ 到根的路径上的所有点。
加入的边如果是 $(x,y)$,那么必然要经过这条边,也就是 $1$ 到 $x$ 路径上的点都要经过。
然后从 $y$ 出发,去一个点 $z$,看 $z$ 的被支配集会不会变。
容易发现如果 $y$ 到 $z$ 上的点没有经过 $1..x$ 路径以及他们的儿子的点,就合法,因此 dfs 一下就没了。
复杂度 $O(nq+n^2)$,跑的很快。
### [联合省选 2021 D2T2](https://loj.ac/p/3503)
简单题,考虑直接状压,记录上面一个在哪里,选 $b_i$,这样是 $O(2^nm^2n^2)$ 的,过不去。
考虑由于 $b_i$ 单调不降,因此考虑横着放即可,然后就不用记录上面一个了,复杂度少一个 $m$。
### [ABC212G](https://atcoder.jp/contests/abc212/tasks/abc212_g)
用原根,把乘法变成加法。
$$
x=r^a,y=y^b
$$
$$
an\equiv b\pmod {p-1}
$$
对于一个 $a$,合法的 $b$ 有 $\frac{p-1}{\gcd(p-1,a)}$ 个,然后欧拉反演一下車没了。
### [CF1706D2](https://codeforces.com/contest/1706/problem/D2)
先整除分块,然后考虑对于一个 $\min$ 去算最小的 $\max$。
这个东西对于分出来的每一个区间可以看成是一个差分,暴力存下来,空间会爆。
事实上这个东西就是一个区间修改,然后就线性了。
### [CF1706E](https://codeforces.com/contest/1706/problem/E)
若干个点形成的连通块,可以先知道他们的 lca,然后相当于每个点到 lca 的路径取个并,这样可以直接线段树了。
但是不需要,因为这些点的连通块还可以看成相邻两个点路径的并,然后就没了。
用重构树想会简单一些。
### [loj3310](https://loj.ac/p/3310)
遍历所有边,先想到欧拉路。
把 $s,i$ 连一条边,那么就是欧拉回路,然后形成若干连通块。
先相邻的奇点匹配掉,然后剩下的要求联通,最小生成树即可。
### [联合省选 2021 D2T1](https://loj.ac/p/3502)
考虑路径可以看成是 $x$ 到 lca,lca 到 $y$ 两条。
$x$ 到 lca 上,只需要每个点记录它上面点权是它加一的点的位置,然后只需要找到第一个 $1$,就可以倍增跳了。
右边那个不太一样,因为不知道终点是啥,所以需要二分一波,二分出个 $u$,那么要算 $y$ 上面第一个 $u$,这个不太好搞。
直接离线一波,然后维护每个点到根路径上的每个值在哪里即可。
### [P6577](https://www.luogu.com.cn/problem/P6577)
学习了一下 KM。
对偶之后,相当于顶标加起来大于边。
当 $vx+vy=edge$ 的时候,这条边为相等边,只要找到一个相等边构成的完美匹配即可。
不断扩展,每次加入一个点,然后左边整体减,右边整体加来调整。
复杂度 $O(n^3)$。
### [P4980](https://www.luogu.com.cn/problem/P4980)
复习一下群。
$$
Ans=\frac{1}{|G|}\sum_{g\in G}X^g
$$
$$
= \frac{1}{n}\sum_{i=1}^n n^{\gcd(i,n)}
$$
$$
= \frac{1}{n}\sum_{d|n} n^d \sum_{i=1}^n [\gcd(i,n)=d]
$$
别急着上莫反,右边那个东西是欧拉函数。
$$
= \frac{1}{n}\sum_{d|n} n^d \varphi(\frac{n}{d})
$$