qbxt2023国庆刷题 Day6 ~ Day7
Day6
\(100+30+100+0,rk3\) ,考成这样还能 \(rk3\) ,好怪啊
虽然但是 \(T3\) 是在 \(oeis\) 上找的,虽然写了随机数但还是运气好过掉了
\(T2\) 应该是写寄了吧,感觉自己做法并没有什么问题
T1
比较典的题,并查集维护下一个没被删的点即可
复杂度 \(O((n+Q) \alpha(n))\)
T2
题目里的同构二字提醒的很明显了,要用树哈希判树同构
题目显然是 \(dp\)
设 \(dp_u\) 表示以 \(u\) 为根的答案。分析样例可以发现对于数形态相同的子树有以下两种性质:
- \(dp\) 值相同
- 对这些子树的根分配的问题等价于可重集问题:找一个长度为 \(n\) 的可重集,所有数 \(\leq m\) 的可重集方案数。问题是一个插板法,把 \(m\) 个板子插到 \(n\) 个空格里
因此我们只需要这么做就可了,复杂度 \(O(n^2)\) ,我用 \(map\) 因此多了 \(O(\log n)\)
T3
一个 \(2 \times 2\) 的矩形只能放一个棋子,我们可以把一个 \(2n \times 2n\) 的格子中每个 \(2 \times 2\) 的格子看成一个点,这样我们就可以把格子看成 \(n \times n\)
考虑当一个棋子放到了小格子的左上角,则在这个小格子左上角的所有小格子,他们都只能放到左上角。同样的,对于右下角某个小格子放了一个棋子,则在这个小格子右下角所有小格子都只能放到右下角。连接这两个小格子之间的一个阶梯,右上和左下都填成小格子填在右上和左下的方案
考虑暴力的计算这个贡献,我们暴力枚举左上角 \((a,b)\) 和右下角 \((c,d)\) ,用组合数填阶梯
一些细节:当 \(a=0, b=0\) 是会算到 \(a=0,b>0\) 的情况,要去重
T4
- 如果我们有一个数不想要,比如说 \(9\) ,我们可以 \(\sqrt{ \sqrt{9} }\) ,然后再乘起来
- 如果有一些数不想要,比如 \(1,2,3,4,5\) ,我们可以把他们加在一起后开根
根据小学数学知识拉格朗日差值,考虑当 \(m=1\) 时,我们可以这么构造,假如 \(x_1 = 2\) ,我们可以让 \(f(x) = \sqrt{ \sqrt{ \sqrt{ \sqrt{ \sqrt{ \sqrt{(x-1)(x-3)(x-4)...(x-9)} } } } } } \times y_1\) 来得到答案
当 \(m \neq 1\) 时,我们可以构造多个 \(f_1(x), f_2(x)\) ,然后把他们加起来即可
然后我们没有考虑完,因为 \(y_1\) 从何而来?我们发现 \(y_1\) 可以二进制分解,而二进制分解我们只需要多个 \(2\) 乘起来。而 \(2 = 1 + 1\) ,因此我们可以凑出 \(y_1\) ,完结
贪心、二分、模拟
-
\(n\) 个线段选最多不相交
右端点排序
但有个神奇的东西,我们把两个相交的线段连边,这个问题就变成了最大独立集,而且图也不是二分图
这个图有一个性质:所有环都是三元环,比如:1 2 1 3 2 4 3 4
这个样子是不可能出现的
因此如果给你一个这样的图,我们可以把他转换成原问题。我们没必要把线段构造出来,但对于一个三元环,里面肯定选的一个点是度数最小的 -
\(n\) 个任务,第 \(i\) 个结束时间 \(d_i\) ,完成需要 \(t_i\) 的时间,如果超出时限产生超出部分的贡献。让贡献最大值最小
- 按 \(t_i\) 排序?
1 100 10 10
- 按 \(d_i - t_i\) 排序?
1 2 10 10
- 二分答案+线段树?
确实可以,但老师要除排序线性贪心
其实这题只要按照 \(d_i\) 排序就行了,但看起来完全不符合直觉,因为你排序甚至和 \(t_i\) 没有关系。我们证明一下:
显然我们的贪心策略一定不存在空隙和逆序对
考虑任意一个没有空隙的策略 \(O\) ,都可以通过交换一个逆序对让答案变得不劣
假设 \(d_j < d_i\) ,则先做 \(i\) 后做 \(j\) 的延迟是: \(\max(f_i - d_i, f_j - d_j)\) ,先做 \(j\) 后做 \(i\) 的延迟是: \(\max(f_j - d_i, f_i - d_j)\) 。显然 \(f_i - d_j \leq f_j - d_j, f_j - d_i \leq f_j - d_j\) ,因此交换会更优 -
设 \(f_i\) 表示前 \(i\) 轮大的赢赢得最多,显然贪心选 \(>a_i\) 的最小的数。设 \(g_i\) 表示后 \(i\) 轮小的赢赢得最多,显然贪心。合并求最大
合并会出现重复选的情况,但因为如果重复,不如交换,因为一个最大一个最小,交换后不劣 -
模拟费用流
如果只有两种币,我们可以假设全选 \(B\) ,然后我们可以按 \(a_i - b_i\) 排序,然后把一些 \(B\) 币换成 \(A\) 币,换言之前 \(X\) 个选 \(A\) ,后 \(Y\) 个选 \(B\)
而有了 \(C\) ,我们可以枚举 \(A/C\) 和 \(B/C\) 的分界点,然后就变成了两个二元问题,直接用上面那个方法做就行 -
从 \(1\) 走到 \(n\) ,每次可以向右走一步,或 \(p_i\) 的概率梭哈到 \(n\) ,或 \(1-p_i\) 的概率落到 \(a_i\) ,问最优策略下期望时间
\(n \leq 10^5, 1 \leq a_i \leq i\)通常看到期望题,第一反应是 \(dp\)
记 \(dp_i\) 表示 \(i \rightarrow n\) 期望时间
\(dp_i = \min\{ 1 + dp_{i+1}, p_i + (1 - p_i)(1 + dp_{a_i})\}\)
显然 \(dp\) 有后效性,而且因为有 \(\min\) 高斯消元也做不了
我们发现假如 \(i\) 是我们最优的梭哈点,我们从 \(1\) 一步一步走到 \(i\) ,然后梭哈一把,如果失败了,他跳到了 \(a_i\) ,作为一个有贪心思想的人,我们肯定会走到 \(i\) 再梭哈,因为他是我们的最优梭哈点,否则我们不如第一次就在 \(a_i\) 梭哈 -
非常典的一道题的魔改,因为有负数
判一下就行了,复杂度 \(O(n \log A)\) -
01背包
\(n \leq 40, V,v_i,w_i \leq 10^9\)数据范围想让 \(O(2^{\frac{n}{2}})\)
\(Meet\ In\ The\ Middle\) -
tip1:中位数是一个非常抽象的东西,他的难度其实是和求排名不相上下的。而求排名我们要怎么做?二分答案。我们可以二分答案,然后把原问题转化为只有 \(01\) 的情况,这个问题就会相对好做一些
我们发现如果我们遇到两个连续的1 1
,那他会一直往上走,直到遇到边边角;0 0
的情况也同理
所以原问题就变成了找到距离对称轴最近的1 1
和0 0
,不会出现1 1
和0 0
距离对称轴距离相等的情况,因为中间的部分必须是0 1
交替的。所以我们每次取最近的就可以成为答案;如果没有0 0
和1 1
,说明序列一定 \(01\) 交替,直接看对称轴左右的数即可 -
老师曰:期望问题,要么组合计数要么 \(dp\)
设 \(dp_{i,j}\) 当前在 \(i, HP = j\) 的期望到 \(n\) 点时间
\[\]\[\]从 \(1\) 走到 \(n\) ,每次可以向右走一步,或 \(p_i\) 的概率梭哈到 \(n\) ,或 \(1-p_i\) 的概率落到 \(a_i\) ,问最优策略下期望时间
\(n \leq 10^5, 1 \leq a_i \leq i\)这题我们解决时用了贪心来避免了 \(dp\) 的后效性,我们能否把结论同时用在这题上呢?实际上是不行的
我们是不是还在讲二分?我们为什么不二分 \(dp_{1,H}\) 的值呢,因为答案显然具有单调性,所以我们就判断即可
其实这个思路在之前的 qoj 的某常比赛里见过,见这里 -
是否还记得我们讲的AGC006D这题?
先考虑一个链会怎么样?会发现对于一个1 1
,他会不断往外扩展,因此在他变成一半 \(0\) 一半 \(1\) 时,操作次数不会超过 \(O(n)\) -
方法1:因为是竞赛图,有环一定有三元环,缩点
方法2:考虑一个点 \(x\) ,一定能找到两个点 \(y,z\) 满足:x -> y x -> z y -> z
那 \(x \rightarrow z\) 这条边一定是没有用的,因为如果我们能找到一点 \(a\) 使 \(x, z, a\) 成为三元环,那 \(y \leftrightarrow a\) 中一定有一边,如果 \(y \rightarrow a\) ,那 \(x, y, a\) 成为三元环;否则 \(y,z,a\) 成三元环。因此我们可以把边 \(x \rightarrow z\) 删掉
于是在图中把若干条边忽略掉后,每个点最多一个出边,因此我们只要枚举两个点,再看和他相连的点是否成环即可。复杂度 \(O(n^2)\)
Day7
\(70+0+0+20,rk36\) , \(T1\) 寄了, \(T2\) 码量题, \(T3\) 写寄了, \(T4\) 暴力。考的不好, \(T1\) 写了两个小时,时间规划不合理
发现自己的代码功底并没有想象的好,不如说变坏了
T1
\(K = 2\) 时把矩阵分成了两部分,那猜测答案把矩阵分成 \(K\) 部分
把矩阵开成一个邻接矩阵,那 \(A^K\) 就是长度为 \(K\) 的路径,题目要求没有,那我们把点分成 \(K-1\) 部分,每部分两两连边
让答案最大,答案就是 \(\prod \frac{n}{K}\) ,注意微调一下
老师曰:要注意矩阵的图论意义
T2
倍增+换根即可,但赛时难写
赛时想得线段树二分,也可
T3
曾经某个刷题营的某场比赛 \(T1\) 用到了一个性质:点越早到越好,因此求最短路
看数据范围,显然分层图
赛时的我考虑对于一个路径用一个中转点建一个类似前缀和的操作,但会有负环,解决方法是对于中转点记录转移前缀,只向后转移,比较麻烦
今天第一次知道分层图跑最短路可以每一层图分别跑,然后合并 \(dp\)
我们考虑只建 \(type=0\) 的边,先考虑第一层,从 \(1\) 开始跑最短路,跑完后我们考虑用 \(dp\) 来跑到下一层。具体的,我们设 \(g_i\) 表示当前层从可到达点到 \(i\) 点的最短路,起初 \(g_i = F_{k,i}\) ,之后对于每一个魔法道路,更新 \(g_u = \min(g_u, g_v + wait(u,v) + w)\) ,最后 \(F_{k+1,i} = g_i\) 作为下一层的已知节点即可。
T4
先观察序列打标,发现有一个规律:毎隔 \(4\) 个里只有一个绝对值不和别的一样,还有每隔 \(4\) 个变一下符号,还有 \(f_n\) 和 \(f_{n+1}\) 毎隔 \(4\) 个 \(\gcd(f_n,f_{n+1}) = f_n\) ,否则 \(\gcd(f_n,f_{n+1}) = 1\)
如果 \(b_2 \neq 0\) ,那由辗转相除 \(a_2,b_2\) 即可
我们处理 \(g = \gcd(a_1 f_n + a_2 f_{n+1}, f_n) = \gcd(a_2 f_{n+1}, f_n)\) ,而因为相邻的两个数是互质的,因此 \(g = \gcd(a_2,f_n) = \gcd(f_n \mod a_2, a_2)\) ,因此直接矩阵优化
知道 \(g\) 后,我们就可以知道 \(\gcd(a_1 f_n + a_2 f_{n+1}, b_1 f_n) = \gcd(a_2 f_{n+1}, gb_1)\) ,因此我们只要看左边这部分在 \(\mod gb_1\) 的值即可
-
- 不能是割点
- 度数为 \(m-(n-2)\)
没了
-
经典性质:连通块个数=保留点数-保留边数
对于保留点数是好算的,考虑保留边数,考虑一条边会对哪些答案贡献,直接算即可
树上也可做 -
一道非常 \(trick\) 的题
有点权有边权,很麻烦,我们考虑把边权去掉
把边权放到点权上,每个点权权值为相邻边权 \(\frac{1}{2}\)
因为如果两个点在两个集合,一减就没有贡献了,而如果两个点在一个集合,一加就会产生边权的贡献 -
看一眼觉得是图论题,但图在哪里?
看到一个二元关系,我们都想给他建一条边对吧?
发现操作有传递性,比如 \(x,y\) 为一类操作, \(y,z\) 为二类操作,那我们可以发现 \(x,z\) 成为了第一类操作;相同的,第一类操作+第一类操作=第二类操作;第二类操作+第二类操作=第二类操作
既然有传递关系,我们就可以把问题建成一个图,然后看联通块之间的关系。具体的,我们对于一个操作,如果是一类操作边为 \(1\) ,否则为 \(0\) ,则两点距离 \(\mod 2\) 就是这两点的操作
于是我们可以二分图染色, \(1\) 边染不同颜色, \(0\) 边染相同颜色,如果不能染说明出现奇环了,则可以在保证总和奇偶性不变的情况下任意的加减。而如果染成功了,那二分图左右两部分的综合分别是不变的,而且在集合内部无论怎么操作都可以实现 -
先把最小生成树求出来。对于非树边,要想进入最小生成树,他的边权必须比这个环上最大的边小即可;对于树边,考虑所有覆盖他的非树边的权值最小值更小即可。但怎么找呢?我们考虑线段树懒标记的思想,对于一个非树边,他就是让他和树上路径的值取一个 \(\min\) ,考虑完所有非树边后更新一遍倍增,把 \(tag\) 都 \(push\) 下去,然后直接做即可
这题说明倍增也是可以修改的,对于一些不具有可减性,且先修改后询问的操作,可以用倍增 -
tip1:这道题是差分约束
设 \(dis_i\) 表示 \(1 \rightarrow i\) 的路径,显然 \(1 \rightarrow i\) 的所有路径等长,说明 \(dis_y = dis_x + w_i\) ,但我们不知道边权啊,因此 \(1 \leq w_i = dis_y - dis_x \leq 9\) ,直接差分约束 -
设 \(f_i\) 表示 \(i\) 左边比他大的位置个数,没跑一次冒泡排序就会让 \(f_i - 1\) ,因此答案为 \(\sum \max(f_i-K,0)\)
-
题目让求 \(2n | k(k+1)\) 最小的 \(k\) ,发现 \(\gcd(k,k+1) = 1\) ,因此 \(2n \rightarrow a \times b\) ,我们枚举 \(a,b\) ,于是我们让找 \(ax = k, by = k+1\) ,一减变成 \(exgcd\) ,复杂度 \(O(2^{\omega(n)} \log n)\)
-
考虑一个朴素的 \(dp\) :设 \(dp_{i,j,k,l}\) 表示前 \(i\) 个数,最后一个红在 \(j\) ,绿在 \(k\) ,蓝在 \(l\) 的方案数,但我们发现 \(a_i\) 这个限制没有用。我们可以设 \(dp_{i,j,k}\) 表示前 \(i\) 个数,和 \(a_i\) 不同的在 \(j\) ,和 \(a_i,a_j\) 都不同的在 \(k\) 方案数。复杂度 \(O(n^3)\)
-
朴素 \(dp\) :设 \(dp_{i,j}\) 表示前 \(i\) 个数组删了 \(j\) 个最大答案。 \(dp_{i,j} = \max\{dp_{i-1,j-k} + sum_k\}\) ,复杂度 \(O(nmk)\)
这题有一个关键结论:如果 \(k\) 能正好取完一个数组,那一个数组要么不取,要么全取。因为数组是不降的。我们枚举哪个数组不能全取,剩下的做背包即可。可这相当于有一个数是会被删除的,我们怎么办呢?分治即可,设分治到 \([l,r]\) 时表示刨去这个区间中物品的答案,对于每次去左子树时把右子树加入背包,右子树同理 -
可达某场比赛考了这题。\(dp\) + 容斥即可。总方案数=所有方案数-过一个黑点+过两个黑点-...。把 \(n\) 个点按照 \(x\) 为第一关键字, \(y\) 为第二关键字排序。设 \(dp_i\) 表示从左上角走到 \(i\) 这个黑点,带容斥系数,然后每次从左上角的节点转移过来即可
据说有恰好经过 \(k\) 个黑点的加强版问题