记录「十一月做题记录」
水题记录。
11.2
P5663 加工零件
题解
发现若 \(s\) 到 \(t\) 一条路径长度为 \(d\) ,那么可以通过在一条边上反复折返使得存在一条长度为 \(d+2k,k\in \N\) 的从 \(s\) 到 \(t\) 的路径。分路径长度的奇偶求出最短路即可。
11.3
P2515 [HAOI2010]软件安装
题解
发现是一个基环树森林,环上的点要么都选,要么都不选,于是可以把环缩成一个点。
缩完点后的图一定是一个森林,可以把所有树根连接到一个虚拟节点上形成一棵树。这样直接树形DP是 \(O(nm^2)\) 的。可以用DFS序优化到 \(O(nm)\) 。
在树上DFS,求出后序遍历的DFS序,在DFS序上DP。
设 \(\mathrm{dp}(i,j)\) 表示考虑到后序遍历的 \(i\) 号结点,背包容量为 \(j\) 时,所能取得的最大价值。设 \(\mathrm{size}_i\) 表示以 \(i\) 为根的子树的大小。
- 若取物品 \(i\) ,则可以取它的子树,所以答案为 \(\mathrm{dp}(i-1,j-1)+v_i\) 。
- 若不取物品 \(i\) ,则不可以取它的子树,则答案为 \(\mathrm{dp}(i-\mathrm{size}_i,j)\) 。
综上可得 \(\mathrm{dp}(i,j)=\max(\mathrm{dp}(i-1,j-w_i)+v_i,\;\mathrm{dp}(i-\mathrm{size}_i,j))\) 。
P5858 「SWTR-03」Golden Sword
题解
令 \(\mathrm{dp}(i,j)\) 表示考虑到第 \(i\) 个原料,当前锅中有 \(j\) 个原料的最大耐久度之和。则有:
单调队列优化即可。
P5020 货币系统
题解
完全背包。
将面值从小到大排序,依次加入。若当前的面值能用之前的面值表示,那么这个面值就是无用的,可以舍去。维护一个背包即可。
P4878 [USACO05DEC]Layout G
题解
差分约束。
判断有无解是基础操作,重点是后两个询问。
因为必须要满足三角形不等式,所以其实从 \(1\) 到 \(n\) 的路径长度其实是确定的。具体一点,若有多个点能够到达点 \(v\) ,为了满足三角形不等式,必须选择这些点中 \(dis_u+w(u,v)\) 最小的点走,发现这就是最短路。
从虚拟源点跑一遍最短路判断有无解,再从 \(1\) 号点跑最短路,得出的 \(dis_n\) 即为所求。
CF804B Minimum number of steps
题解
手玩几组数据不难发现:\(a\) 的数量总是不变的。我们从左往右扫这个字符串,若遇到一个 \(b\) ,将它前面的 \(a\) 全部移到它后面去。因为扫到这个 \(b\) 时,前面所有的 \(a\) 已经通过前面的 \(b\) 移到了当前字符串的末尾,这样保证了新加入的 \(b\) 一定能够将它之前的 \(a\) 移到后面去。
通过手玩数据,不难发现另一个结论:若 \(b\) 前面有 \(c\) 个 \(a\) ,那么将这 \(c\) 个 \(a\) 全部移到后面去的操作次数为 \(\sum_{i=1}^c2^{i-1}\) 。预处理出这个和式,统计答案。
11.4
CF1366D Two Divisors
题解
假如已经选出了两个因数 \(x,y\) ,满足 \(\gcd(x+y,a)=1\) 。
令 \(d=\gcd(x,y)\) ,设 \(x'=\frac{x}{d},y'=\frac{y}{d}\) ,可以得到式子 \(\gcd(d\times (x'+y'),a)=1\) 。因为 \(x,y\) 都是 \(a\) 的因数,那么 \(d\) 也是 \(a\) 的因数,则 \(\gcd(d\times(x'+y'),a)\geq d\) 。为了满足 \(\gcd(d\times (x'+y'),a)=1\) ,一定有 \(d=1\) ,则有 \(x\bot y\) 。
将 \(a\) 分解质因数,\(a=\prod_{i=1}^mp_i^{c_i}\) ,取 \(x=p_1^{c_1},y=\frac{a}{x}\) 即可。
P5651 基础最短路练习题
题解
由所有简单环的异或和都为 \(0\) 可知,两点之间的所有简单路径的长度都是相同的。那么只需要随意求出一条路径即可。
CF1445D Divide and Sum
题解
考试的时候没推出来/kk。
将 \(a\) 数组升序排序,令 \(L=\{a_1,a_2,\cdots,a_n\},R=\{a_{n+1},a_{n+2},\cdots,a_{2n}\}\) 。
有结论:将 \(a\) 分成任意两个集合 \((p,q)\) ,对于任意的 \(i\) ,\(x_i\) 和 \(y_i\) 不会同时在 \(L\) 或者 \(R\) 中。
证明:
假设 \(x_i\) 和 \(y_i\) 同时在 \(L\) 中。因为 \(p,q\) 中元素单调,那么有 \(i\) 个元素小于等于 \(x_i\) ,有 \(n-i+1\) 个元素小于等于 \(y_i\) ,并且它们互不重合,由于小于等于 \(x_i,y_i\) 的元素只能在 \(L\) 中,得出 \(L\) 中有 \(n+1\) 个元素,与上文矛盾。
证毕。
那么 \(f(p,q)\) 的值就是一定的,答案即为:
11.5
P2662 牛场围栏
题解
同余最短路板子题。
求出 \(d_i\) 后,答案即为:
CF1443B Saving the City
题解
相邻的两个极长 \(1\) 串只有两种消除方法,要么花费 \(2\times a\) 的代价分别消除,要么先将两串中间的 \(0\) 串变为 \(1\) ,再一起消除。在两种方法中取最优即可。
P5520 [yLOI2019] 青原樱
题解
考虑先提出放树苗的 \(m\) 个位置,剩下 \(n-m\) 个位置,树苗要放在这些位置的 \(n-m+1\) 个空位中,所以答案为 \(A_{n-m+1}^m\) 。
P2467 [SDOI2010]地精部落
题解
令 \(f_{i,j}\) 表示使用数 \(1\sim i\) ,\(j\) 在第一个位置且为山峰的方案数。有转移:
- 若 \(j-1\) 不在第二个位置,那么交换 \(j\) 和 \(j-1\) 依然合法,则 \(f_{i,j}=f_{i,j-1}\) 。
- 若 \(j-1\) 在第二个位置,考虑去掉第一个位置的数 \(j\) ,剩下有互不相同的 \(i-1\) 个数,且 \(j-1\) 在第一个位置且为山谷。为了使 \(j-1\) 变成山峰,考虑将这 \(i-1\) 个数中每一个数 \(x\) 变为 \(i-x+1\) ,此时依然合法,并且 \(j-1\) 这个位置变成了山峰(此时 \(j-1\) 变成了 \(i-j+1\) ),则 \(f_{i,j}=f_{i-1,i-j+1}\) 。
综上,有 \(f_{i,j}=f_{i,j-1}+f_{i-1,i-j+1}\) 。
最后的答案即为 \(2\times \sum_{i=1}^nf_{n,i}\) 。
11.6
CF1442A Extreme Subtraction
题解
如果这个序列是单调不增的,那么可以通过不断操作前缀使得整个序列变为 \(0\) 。考虑通过操作后缀使得整个序列变为单调不增。从后往前考虑,设当前枚举到了 \(i\) ,后缀 \([i+1,n]\) 已经变为单调不增,若 \(a_i\geq a_{i+1}\) ,那么无需操作;否则将后缀 \([i+1,n]\) 整体减 \(a_{i+1}-a_i\),使得 \(a_i=a_{i+1}\) ,若 \(a_n\) 减到了 \(0\) 以下,那么无解。
CF920F SUM and REPLACE
题解
约数个数是 \(\log\) 级别的,也就是说对一个数操作 \(\log\) 次就可以使得这个数再次操作时不再变化。用线段树维护区间内还能操作的数的个数,暴力修改即可,复杂度 \(\Theta(n\log^2 n)\) 。
P4823 [TJOI2013]拯救小矮人
题解
较矮的人一定先出去,所以先按照每个人的高度从小到大排序。考虑在排好序的数组上DP,令 \(\mathrm{dp}(i)\) 表示考虑到第 \(i\) 个人时,离开了 \(j\) 个人后人梯的最大高度,从左往右依次考虑每一个人,若能出去就出去,更新DP数组:\(\mathrm{dp}(i,j)=\mathrm{dp}(i-1,j-1)-a_i\) 。
P4306 [JSOI2010]连通数
题解
Floyd求解传递闭包板子,用bitset优化一下即可。
11.7
P6801 [CEOI2020]花式围栏
题解
用单调栈维护高度单调上升的矩形。每次加入一个新矩形时,若栈顶的矩形高度小于等于当前矩形,让当前矩形直接入栈;否则,降低栈顶矩形的高度,同时不能破坏栈内的单调性,统计降低的高度对答案的贡献。
P5689 [CSP-SJX2019]多叉堆
题解
用并查集维护树的形态,同时对于每一个树根维护答案 \(\mathrm{F}\) 和子树大小 \(\mathrm{siz}\)。
若将 \(y\) 接在 \(x\) 下面,则以 \(x\) 为根的堆的答案 \(\mathrm{F}'(x)=\mathrm{F}(x)\times \mathrm{F}(y)\times {\mathrm{siz}(x)+\mathrm{siz}(y)-1 \choose \mathrm{siz}(y)}\) 。
P5687 [CSP-SJX2019]网格图
题解
将边权相同的边一起考虑,从小到大加入边,判断最多能加入几条边即可。
11.8、11.9、11.10
因为CSP-S爆炸,自闭三天
11.11
P7043 「MCOI-03」村国
题解
发现最后会在两个点之间反复横跳,判断最后停在那个点即可。另外只有一个点的情况需要特判。
CF1443B Saving the City
题解
考虑一段1是和上一段1一起消掉,还是自己消掉,取最优值即可。
11.12
考试
11.13
P3937 Changing
题解
手玩一下样例发现每个数的贡献是杨辉三角的第 \(t+1\) 层,预处理组合数即可。因为只需要知道奇偶性,所以只需要预处理组合数的奇偶即可。
11.14
买了gmoj的号,感觉有点小贵。
GMOJ100137 胖头鱼的排序
题解
GMOJ1021 【中山市选2008】矩阵
题解
直接乘显然爆炸,但是由于是01矩阵,很容易就能想到用bitset压位。复杂度 \(\Theta(\frac{n^3}{w})\) 。
11.15
P1850 换教室
题解
考虑DP,令 \(\mathrm{dp}(i,j,0/1)\) 表示考虑到第 \(i\) 个时间段,已经申请了 \(j\) 次,第 \(i\) 次有没有申请。分类讨论一下第 \(i\) 和第 \(i-1\) 个时间段分别有没有申请即可。
GMOJ6806 achen
题解
要多看部分分的提示。
先考虑 \(A=1,B=n\) 怎么做。令 \(\mathrm{f}(i)\) 表示遍历 \(1\sim i\) 的方案数,有转移式 \(\mathrm{f}(i)=\mathrm{f}(i-1)+\mathrm{f}(i-3)\) 。
考虑一般情况,如果 \(A\not =1\) ,那么从 \(A\) 出发一定要先遍历 \(1\sim A-1\) ,否则后面就遍历不到了,发现有且只有一种方案从 \(A\) 出发遍历完 \(1\sim A-1\) 后到达 \(A+1\) 。同理,到达 \(B\) 之前一定要先遍历 \(B+1\sim n\) ,方案也只有一种。\(A+1\sim B-1\) 的部分用部分分的做法即可。
11.16
GMOJ6866 minmax
题解
考虑点分治。假设由某个分治中心 \(x\) 开始,计算出了两条路径 \(x-u\) 和 \(x-v\) ,它们的边权最大值分别为 \(\mathrm{Max}_1,\mathrm{Max}_2\) ,最小值分别为 \(\mathrm{Min}_1,\mathrm{Min}_2\) ,分类讨论 \(u-v\) 何时能够成为答案:
- 若 \(\mathrm{Max_1}-\mathrm{Min_1}<k,\mathrm{Max_2}-\mathrm{Min_2}<k\) ,假设 \(\mathrm{Max_1}>\mathrm{Max_2}\) ,那么有 \(\mathrm{Max_1}-\mathrm{Min_2}=k\) ,移项得 \(\mathrm{Max_1}-k=\mathrm{Min_2}\) ,可以用桶记一下所有的 \(\mathrm{Min}\) ,枚举 \(\mathrm{Max}\) 在桶中查询。
- 若 \(\mathrm{Max_1}-\mathrm{Min_1}=k,\mathrm{Max_2}-\mathrm{Min_2}\leq k\) ,可以得到 \(\mathrm{Max_2}\leq \mathrm{Max}_1\leq \mathrm{Min}_2+k\) ,开一个值域线段树记录 \(\mathrm{Max}\) ,查询时查询区间 \([\mathrm{Max_2},\mathrm{Min}_2+k]\) 的区间和。
注意当 \(\mathrm{Max_1}-\mathrm{Min_1}=k,\mathrm{Max_2}-\mathrm{Min_2}=k\) 时会算重,需要处理一下。
11.17
上午纪中考试,下午和晚上调T3
11.18
CF1404B Tree Tag
题解
发现只有两种情况 \(\text{Alice}\) 会赢:
- \(\mathrm{dis}(a,b)\le da\) ,即 \(\text{Alice}\) 能一步跳到 \(\text{Bob}\) 。
- \(2\times da\geq \min(len,db)\) ,即 \(\text{Alice}\) 能把 \(\text{Bob}\) 逼到死角,因为 \(\text{Bob}\) 跳跃的距离不能超过直径,所以要对直径 \(len\) 取 \(\min\) 。
GMOJ1022 【中山市选2008】小树
题解
降智题
考虑两个点 \(x,y\) ,假设 \(\frac{w_x}{d_x}<\frac{w_x+w_y}{d_x+d_y}\) ,得:
能够得到:
再做一些变形,还能得到:
显然有:
那么可以得出结论:选一个点一定比选两个点更优。
从根跑一遍dfs即可。