qbxt2023国庆刷题 Day6 ~ Day7

Day6

\(100+30+100+0,rk3\) ,考成这样还能 \(rk3\) ,好怪啊
虽然但是 \(T3\) 是在 \(oeis\) 上找的,虽然写了随机数但还是运气好过掉了
\(T2\) 应该是写寄了吧,感觉自己做法并没有什么问题

T1

比较典的题,并查集维护下一个没被删的点即可

复杂度 \(O((n+Q) \alpha(n))\)

T2

题目里的同构二字提醒的很明显了,要用树哈希判树同构

题目显然是 \(dp\)

\(dp_u\) 表示以 \(u\) 为根的答案。分析样例可以发现对于数形态相同的子树有以下两种性质:

  1. \(dp\) 值相同
  2. 对这些子树的根分配的问题等价于可重集问题:找一个长度为 \(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

  1. 如果我们有一个数不想要,比如说 \(9\) ,我们可以 \(\sqrt{ \sqrt{9} }\) ,然后再乘起来
  2. 如果有一些数不想要,比如 \(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\) 的时间,如果超出时限产生超出部分的贡献。让贡献最大值最小

    1. \(t_i\) 排序?
    1 100
    10 10
    
    1. \(d_i - t_i\) 排序?
    1 2
    10 10
    
    1. 二分答案+线段树?
      确实可以,但老师要除排序线性贪心

    其实这题只要按照 \(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\) ,因此交换会更优

  • bzoj #4391

    \(f_i\) 表示前 \(i\) 轮大的赢赢得最多,显然贪心选 \(>a_i\) 的最小的数。设 \(g_i\) 表示后 \(i\) 轮小的赢赢得最多,显然贪心。合并求最大
    合并会出现重复选的情况,但因为如果重复,不如交换,因为一个最大一个最小,交换后不劣

  • AGC018C

    模拟费用流
    如果只有两种币,我们可以假设全选 \(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\) 梭哈

  • ABC155D

    非常典的一道题的魔改,因为有负数
    判一下就行了,复杂度 \(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\)

  • AGC006D

    tip1:中位数是一个非常抽象的东西,他的难度其实是和求排名不相上下的。而求排名我们要怎么做?二分答案。我们可以二分答案,然后把原问题转化为只有 \(01\) 的情况,这个问题就会相对好做一些
    我们发现如果我们遇到两个连续的 1 1 ,那他会一直往上走,直到遇到边边角; 0 0 的情况也同理
    所以原问题就变成了找到距离对称轴最近的 1 10 0,不会出现 1 10 0 距离对称轴距离相等的情况,因为中间的部分必须是 0 1 交替的。所以我们每次取最近的就可以成为答案;如果没有 0 01 1 ,说明序列一定 \(01\) 交替,直接看对称轴左右的数即可

  • ARC016D

    老师曰:期望问题,要么组合计数要么 \(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 的某常比赛里见过,见这里

  • CF1244F

    是否还记得我们讲的AGC006D这题?
    先考虑一个链会怎么样?会发现对于一个 1 1 ,他会不断往外扩展,因此在他变成一半 \(0\) 一半 \(1\) 时,操作次数不会超过 \(O(n)\)

  • CF117C

    方法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\) 的值即可

  • UOJ #67

    1. 不能是割点
    2. 度数为 \(m-(n-2)\)

    没了

  • CF1151E

    经典性质:连通块个数=保留点数-保留边数
    对于保留点数是好算的,考虑保留边数,考虑一条边会对哪些答案贡献,直接算即可
    树上也可做

  • P4643

    一道非常 \(trick\) 的题
    有点权有边权,很麻烦,我们考虑把边权去掉
    把边权放到点权上,每个点权权值为相邻边权 \(\frac{1}{2}\)
    因为如果两个点在两个集合,一减就没有贡献了,而如果两个点在一个集合,一加就会产生边权的贡献

  • P6185

    看一眼觉得是图论题,但图在哪里?
    看到一个二元关系,我们都想给他建一条边对吧?
    发现操作有传递性,比如 \(x,y\) 为一类操作, \(y,z\) 为二类操作,那我们可以发现 \(x,z\) 成为了第一类操作;相同的,第一类操作+第一类操作=第二类操作;第二类操作+第二类操作=第二类操作
    既然有传递关系,我们就可以把问题建成一个图,然后看联通块之间的关系。具体的,我们对于一个操作,如果是一类操作边为 \(1\) ,否则为 \(0\) ,则两点距离 \(\mod 2\) 就是这两点的操作
    于是我们可以二分图染色, \(1\) 边染不同颜色, \(0\) 边染相同颜色,如果不能染说明出现奇环了,则可以在保证总和奇偶性不变的情况下任意的加减。而如果染成功了,那二分图左右两部分的综合分别是不变的,而且在集合内部无论怎么操作都可以实现

  • CF827D

    先把最小生成树求出来。对于非树边,要想进入最小生成树,他的边权必须比这个环上最大的边小即可;对于树边,考虑所有覆盖他的非树边的权值最小值更小即可。但怎么找呢?我们考虑线段树懒标记的思想,对于一个非树边,他就是让他和树上路径的值取一个 \(\min\) ,考虑完所有非树边后更新一遍倍增,把 \(tag\)\(push\) 下去,然后直接做即可
    这题说明倍增也是可以修改的,对于一些不具有可减性,且先修改后询问的操作,可以用倍增

  • P5590

    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\) ,直接差分约束

  • P6186

    \(f_i\) 表示 \(i\) 左边比他大的位置个数,没跑一次冒泡排序就会让 \(f_i - 1\) ,因此答案为 \(\sum \max(f_i-K,0)\)

  • AT_acl1_b

    题目让求 \(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)\)

  • AT_arc074_c

    考虑一个朴素的 \(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)\)

  • CF1442D

    朴素 \(dp\) :设 \(dp_{i,j}\) 表示前 \(i\) 个数组删了 \(j\) 个最大答案。 \(dp_{i,j} = \max\{dp_{i-1,j-k} + sum_k\}\) ,复杂度 \(O(nmk)\)
    这题有一个关键结论:如果 \(k\) 能正好取完一个数组,那一个数组要么不取,要么全取。因为数组是不降的。我们枚举哪个数组不能全取,剩下的做背包即可。可这相当于有一个数是会被删除的,我们怎么办呢?分治即可,设分治到 \([l,r]\) 时表示刨去这个区间中物品的答案,对于每次去左子树时把右子树加入背包,右子树同理

  • CF559C

    可达某场比赛考了这题。\(dp\) + 容斥即可。总方案数=所有方案数-过一个黑点+过两个黑点-...。把 \(n\) 个点按照 \(x\) 为第一关键字, \(y\) 为第二关键字排序。设 \(dp_i\) 表示从左上角走到 \(i\) 这个黑点,带容斥系数,然后每次从左上角的节点转移过来即可
    据说有恰好经过 \(k\) 个黑点的加强版问题

posted @ 2023-10-04 20:05  FOX_konata  阅读(10)  评论(0编辑  收藏  举报