基础省选题选做

NOIP 活了,不知道要改成什么样,所以找些基础的省选题玩玩,就当是接触些思路,防止 NOIP 出现鬼畜现象。

upd: 真就简单省选题都没联赛难了嗷!

[HEOI2013]Eden 的新背包问题

把物品二进制拆分,使用 cdq 分治来完成这个 dp 过程。

cdq 的时候,按照 dp 右边 $ o$ 递归左边 $ o$ 清空 $ o$ dp 左边 $ o$  递归右边 的顺序执行。

[GZOI2017]取石子游戏

让 Alice 必败的条件是,Alice 无法在第一堆中取走若干使得剩下异或和为 $0$。

枚举让 Alice 先选择哪一堆,用 $f_{i, j}$ 表示前 $i$ 堆,选出若干,异或和为 $j$ 的方案数。

所有异或和 $ge$ Alice 先选择的那一堆的都可以计入答案。

[HEOI2014]人人尽说江南好

显然,最终的时候,前若干堆都是大小为 $m$ 的,最后一堆是大小为 $n mod m$ 的。

总共的操作次数就是 $n - lceil frac n m ceil$,判断奇偶性。

[JLOI2011]飞行路线

分层图最短路,共 $k + 1$ 层,同层之间正常连边,相邻层视为使用了一次免费权利,连 $0$ 边。

求最短路就可以了。

[BJOI2018]求和

预处理出 $k$ 分别为 $1 sim 50$ 时,某点到根路径上的深度的 $k$ 次方和。

使用 LCA,树上前缀和求答案即可。

[SHOI2015]自动刷题机

分别二分上界(最后一个 $ge k$ 的)和下界(第一个 $le k$ 的),带入检验数据是否合理。

[SDOI2016]排列计数

考虑选哪 $m$ 个位置,方案是 $inom n m$,剩下的就是一个错排问题,答案是 $inom n m imes D_{n-m}$。

预处理组合数和错排可以 $O(1)$ 回答每组询问。

[CQOI2017]小Q的棋盘

找出树上的最长链长度 $l$,分类讨论一下:

如果 $m le l$,答案为 $m+1$(最长链走不完就一直走)。

如果 $m > l$,答案为 $min(n, l+frac {m-(l-1)}{2})$(能走到头了就边往新的地方走边回溯,最终回到最长链上)。

 [BJOI2012]算不出的等式

原式可以理解为,一个 $frac{p-1}{2} imes frac{q-1}{2}$ 的网格的主对角线被分成的两部分的整点数之和。

因为 $p, q$ 都是质数,所以整点数之和就是 $frac{p-1}{2} imes frac{q-1}{2}$。

需要特判的是 $p=q$ 的情况,答案为 $frac{p^2 - 1}{4}$。

[TJOI2019]甲苯先生的字符串

考虑 dp,用 $f_{i, j}$ 表示长度为 $i$,最后一个字母为 $j$ 的 $s2$ 串的个数。

发现这个 dp 很容易矩阵快速幂优化,对于转移矩阵 $ ext{Trans}$,如果 $s1$ 中两个字母 $a$ 和 $b$ 是相邻的,那就把 $ ext{Trans}_{a, b}$ 赋值为 $0$,否则赋值为 $1$ 即可。

[GXOI/GZOI2019]旅行者

分别建出原图和反图,各跑一次 Dijkstra 进行最近关键点染色。

枚举一条边,如果这条边的两个端点都在两次中被染色且颜色不同,则用这两个距离之和加上这条边本身的长度更新答案。

当然这题有一种玄学算法就是,随便划分出两个点集,跑最短路。如果按照比特位为 $0/1$ 划分,跑 $log n$ 次的话可以确保算法正确,因为最近点对的编号总有一位不同。

 [TJOI2019]大中锋的游乐场

又是分层图最短路。

不妨定义一个饥饿度,按照饥饿度分层,把 $a_i = 1$ 看作饥饿度 $+1$,$a_i = 2$ 看作饥饿度 $-1$,那么在 $[-k, k]$ 层数中跑最短路即可。

注意处理起点和终点的饥饿度变化。

[HAOI2011]向量

发现向量可以化简为 $(a, b), (a, -b), (b, a), (b, -a)$ 共 4 个。

设 4 种向量分别用了 $k_1, k_2, k_3, k_4$ 次,则有 $x=(k_1+k_2)a+(k_3+k_4)b, y=(k_1-k_2)b+(k_3-k_4)a$。

用 $r_1, r_2, r_3, r_4$ 分别还原代替掉 $k_1+k_2, k_3+k_4, k_1-k_2, k_3-k_4$,问题转化为,方程有解且 $r_1, r_3$ 同奇偶,$r_2, r_4$ 同奇偶。

然后根据它们到底是奇数还是偶数分类讨论一下,根据裴蜀定理确定限制条件。

令 $g = 2gcd(a, b)$,最终要求为 $(g|x land g|y)$ 或 $(g|(x+a) land g|(y+b))$ 或 $(g|(x+b) land g |(y+a))$ 或 $(g|(a+b+x) land g|(a+b+y))$。

[GZOI2017]等差子序列

用两个 bitset 分别维护前缀出现过的数和后缀出现过的数,枚举中间数,相应位置交起来看看存不存在就行了。

当然上面的做法时间比较悬,更优秀的做法可以构造多项式通过 FFT 卷起来看看存不存在。

[TJOI2018]数学计算

对于操作建立一棵线段树,每个结点的初始值为 $1$。

插入操作相当于把一个位置赋值为 $v$,删除操作相当于把一个位置赋值为 $1$。

然后线段树维护全局乘积就好了。

[JSOI2016]反质数序列

观察到,质数一定是一个偶数和一个奇数的和($2$ 除外)。

如果某个偶数和某个奇数都选会产生冲突,就连一条边,答案就是这张二分图的最大独立集,可以用 Dinic 来做。

注意到,两个 $1$ 不能同时选,所以只保留一个 $1$ 在图中,剩下的 $1$ 直接删掉。

[HNOI/AHOI2018]道路

考虑逆推,用 $f_{u, i, j}$ 表示根到 $u$ 有 $i$ 条未翻修的公路和 $j$ 条未翻修的铁路,子树内的最小代价。

转移的时候,叶子结点可以直接用 $c_u imes (a_u + i) imes (b_u+j)$ 表示,非叶子结点考虑翻修哪边就好了。

转移方程:$f_{u, i, j} = min (f_{lson, i, j} + f_{rson, i, j+1}, f_{lson, i+1, j} + f_{rson, i, j})$。

恶心的是这题卡空间,可以通过 vector 动态开数组,遇到用不上的就删除的方式卡过去,同一时刻最多开 $40$ 个数组。

[SDOI2016]齿轮

设 $1$ 号齿轮的转动情况为 $1$,则可以用分数表示出其他齿轮的转动情况。

在 DFS 树上推出每个齿轮的转动情况后,用横叉边检验是否合法即可。

为了避免浮点误差,可以使用对每个结点开一个数组,分别储存其每种质因子的次数。

[FJOI2018]所罗门王的宝藏

把每行每列都抽象为一个结点,构造一张 $n+m$ 个点的图。

设第 $i$ 行共加上了 $x_i$,第 $i$ 列共减去了 $y_i$,则对于一个关键点 $(r, c, p)$,有 $x_r - y_c = p$。

那么可以建立差分约束系统,判断负环即可。

[TJOI2017]可乐

巧妙的构造矩阵,进行快速幂转移。

新建一个编号为 $0$ 的点,表示“自爆”。新的邻接矩阵中除了原来的边,每个点分别向自己和 $0$ 再连两条边。

于是把这个矩阵 $t$ 次方后,$sumlimits_i ext{Matrix}_{1, i}$ 就是答案了。

[GZOI2017]小z玩游戏

对每种兴趣程度建一个点,$i$ 向 $kcdot i$ 连有向边,$w_i$ 向 $e_i$ 连有向边。

跑一次 Tarjan 求出强连通分量,答案就是 $w_i$ 和 $e_i$ 属于同一个强连通分量的游戏个数。

注意到倍数关系的连边是 $O(n log n)$ 级别的,且每次固定不变,所以可以提前连好这么一张图,$w_i$ 和 $e_i$ 之间的边在另一张每次都需要清空的图上连,实际处理的时候的图是这两张图的并集。

[HEOI2016/TJOI2016]树

可以离线逆序处理操作,使用并查集巧妙地维护。

初始时记录每个点被打标记的次数,如果某个点 $u$ 本身被标记了,那么并查集里 $u$ 的父亲就是 $u$,否则就是树上的父亲。

对于查询操作,直接查找并查集里 $num_i$ 的祖先就行了;对于修改操作,将 $num_i$ 被打标记的次数 $-1$,如果次数变成 $0$ 了就把并查集里它的父亲改成树上的父亲。

[JSOI2016]无界单词

考虑容斥 dp,第一问用 $f_i$ 表示长度为 $i$ 的没有 border 的字符串个数,转移时枚举 border 的长度,即:

$$ f_i = 2^i - sum_{j=1}^{lfloor frac{i}{2} floor} f_j imes 2^{i-2j}$$ 

第二问考虑逐位确定,先把该位填为 a,dp 一下看看有多少符合条件的字符串,如果 $<K$,那就把这一位填为 b,$K gets K - f_n$。

第二轮的 dp 可以参考第一轮的思路,分类讨论一下,设当前确定了 $l$ 位,对于 $i le l$,可以 KMP 一遍标记存不存在 border;对于 $i > l$,设枚举的 border 长度为 $j$:

  • 如果 $j ge l$,则贡献为 $-f_j imes 2^{i-2j}$;
  • 如果 $i - l le j < l$,如果当前 border 符合条件则贡献为 $-f_j$,否则贡献为 $0$;
  • 如果 $j<i-l$,贡献为 $-f_j imes 2^{i-j-l}$。

时间复杂度 $O(n^4)$,注意 $2^{64}$ 爆 unsigned long long 了。

原文地址:https://www.cnblogs.com/syksykCCC/p/EasyProblems.html