11 月做题记录
P6779 [Ynoi2009] rla1rmdq(分块)
简单题。我们发现如果两个点已经构成祖先-后代关系那么下面的点就没用了,更进一步的,如果现在要跳上去的点曾经被到达过那么这个点就没用了。那如果每次是全局修改,可以维护有用的点集以及 \(vis\) 表示这个点是否已经被到达过,每次暴力遍历 \(u\in S\) 将其变成 \(\mathrm{father}_u\),如果已经到达过就不加入集合,否则更新 \(vis\) 并加入新集合,由于每向集合中加入一个数就一定会将某个 \(vis\) 从 \(0\) 变成 \(1\),这样做的均摊时间复杂度就是 \(O(n)\) 的。对区间修改直接套个分块就行了,打个 \(tag\) 表示整块跳跃次数的懒标记,如果修改到整块就用上述分析的方法跳点,如果是散块直接暴力重构,需要支持查询一个点的 \(K\) 级祖先,当然可以长剖做到单次 \(O(1)\),貌似有一个非常聪明的做法就是直接用重链剖分,往上不断跳重链直到 \(K\) 级祖先在这个重链上,然后 \(O(1)\) 用 dfn 拿出来,看似是要带 \(\log\) 的,不妨摊还分析一下,设 \(d_i\) 表示 \(a_i\) 往上有几条重链,令势能 \(\Phi=\sum d_i\),初始势能是 \(O(n\log n)\) 的,修改时 \(a_i\) 每跳一次重链都会让势能减少 \(1\),因此均摊下来这部分的总时间复杂度是可以忽略的 \(O(n\log n)\)。直接在线做需要对每个块维护集合以及 \(vis\),会炸空间,离线下来对每个块分别做即可,时间复杂度 \(O(n\sqrt{n})\),空间复杂度线性。
CF547D Mike and Fish(欧拉回路,Ad-hoc)
一个矩阵网格图直接交替黑白染色即可,同理对应到此题可以将每一行的点拉出来相邻两点连边,列同理。然后对建出的图进行黑白染色。这个是假的,原因在于并不能保证无奇环。思考为什么上述做法是错的,上述做法其实还加上了一个“相邻两点颜色不同”的限制,限制太强导致无解,考虑放宽限制,不妨只在 \((2k,2k+1)\) 之间连边,形成的边是若干长度为 \(2\) 的独立组 \((1,2)(3,4)(5,6)\dots\),我们发现对这个进行二分图染色已经足以刻画题设条件。还有一种思考方式,“差 \(\le 1\)” 可以刻画成红色点和蓝色点两两匹配,最后落单的一个点其实不重要。这样建出来的图就是对的了,因为这个图上点的所有环一定交替走横向、竖向边,一定不会出现奇环。
还有一种构造方法,不太能想到。拆一下点,把行列拉出来分别看成点,如果平面上有点 \((x,y)\) 就连边 \((R_x,C_y)\)。
然后就是一个 trick,考虑将点的染色转化成对边定向,如果 \(R\) 指向 \(C\) 就是红色,\(C\) 指向 \(R\) 就是蓝色。
发现这样转化完之后,行列上红蓝点个数的差值其实就等于对应点入度与出度的差值。现在要求这个差值 \(\le 1\)。
看到入度与出度的差不难想到欧拉回路。如果所有点的度数都是偶数直接拉一条欧拉回路出来定向即可。
考虑有奇度点怎么办,在原问题的要求中我们其实有 \(1\) 条边的容错,考虑新建一个虚拟点,所有奇数点都向这个虚拟点连一条有向边,由于总度数和是偶数,奇数点数量一定有偶数个,这样连完之后新图上的每个点度数都是偶数的,一定可以求出一条欧拉回路,按这个欧拉回路定向之后每个点都有 \(\mathrm{in}_u=\mathrm{out}_u\),删去与虚拟点的连边至多对每个点造成 \(1\) 的度数差,因此这样构造是对的。
CF1264E Beautiful League
直接对着三元环这个形态硬做就死掉了,因为这与具体边的形态相关,考虑容斥转化一下。一个经典 Trick 是先把竞赛图看成完全图,这样三元环数量有 \(\binom{n}{3}\) 个,加上有向边的限制之后每一个 \(x\to y,x\to z\) 的结构都会让实际三元环数量少一个,令 \(\mathrm{deg}_i\) 表示点 \(i\) 的出度,这样的结构有 \(\sum\limits_{i=1}^n \binom{\mathrm{deg}_i}{2}\) 个。因此竞赛图三元环数量可以表示成 \(\binom{n}{3}-\sum\limits_{i=1}^n \binom{\mathrm{deg}_i}{2}\),对应到此题就是要对边定向来最小化 \(\sum\limits_{i=1}^n {\mathrm{deg}_i}^2\)。发现常规做法并不能很好的处理这个问题,并且数据范围比较小,直接费用流。
考虑如何建图来刻画“定向确定点的出度”,对每条无向边 \((u,v)\) 建立虚点 \(e_{uv}\),让 \(e_{uv}\) 分别向点 \(u,v\) 连一条流量为 \(1\) 费用为 \(0\) 的边,源点向 \(e_{uv}\) 连流量为 \(1\) 费用为 \(0\) 的边,这样如果最终 \(e_{uv}\to u\) 点边满流就表示将这条边定向为 \(u\to v\),反之如果 \(e_{uv}\to v\) 满流表示这条边定向为 \(v\to u\),如果这条边已经被定向只连一个点即可。不难发现这样建图之后每点的流量就对应其在原图中的出度。不过贡献是平方项 \({\mathrm{deg}_i}^2\),这也不难处理,由于贡献函数是凸的,用差分转化一下,\((\mathrm{deg}_i+1)^2-{\mathrm{deg}_i}^2=2{\mathrm{deg}_i}+1\),因此直接建立若干条边 \((i,T,1,2w+1)\),这个贡献是随 \(\mathrm{deg}\) 的增长严格递增的,在跑费用流时一定会优先把小的贡献加上,因此这样建边是正确的。
CF1355F Guess Divisors Count
首先是 \(\frac{1}{2}≤ans/d≤2\) 这个限制,他告诉我们猜数 \(2x\) 可以将标准答案在 \([x,4x]\) 中的情况全部覆盖。我们熟知,比 \(\sqrt{V_X}\) 大的因子最多只有 \(1\) 个,这个限制只能扩大到 \(2\) 倍,太松了。进一步的,比 \(\sqrt[3]{V_X}=\sqrt[3]{10^9}=10^3\) 大的质因子至多只有 \(2\) 个,最多凑到 \({P_1}^1\times {P_2}^1\) 的形式得到 \(4\) 倍贡献,因此我们只需要求出只考虑 \(\le 10^3\) 的质因子时得出的标准答案 \(ans\),输出 \(2\cdot ans\) 即可。
在只考虑小质因子时的交互方式比较容易想到,取 \(Q=2\times 3\times 5\times 7\times \dots \times P_1\le V_Q\) 进行一次询问可以得到这个质数集中有哪些质因子出现了,按 \(V_Q\) 的限制分段,一直分到所有 \(\le 10^3\) 的质数,写出来发现这样分有 \(25\) 组。得到所有质因子的集合之后,容易发现对质数 \(p\) 只需要 \(Q\) 中带一个足够大的 \(p^t\) 作为因子就可以得到 \(p\) 在 \(X\) 中的指数,对每个 \(p\) 可以取 \(p^{\lceil \log_p V_X\rceil}\),将这些数在不爆 \(V_Q\) 上界的前提下尽可能凑起来一起问,同时在确定质因子的同时不断缩小 \(V_X\) 这个上界即可。但是这样仍然需要至少 \(25\) 次询问,不可行。
这个询问策略本身不太能优化了,故考虑将 \(10^3\) 这个上界进一步缩小。注意到 \(|ans-d|\le 7\) 这个限制还没用上。一个观察是 \(ans\) 已经有一定值的时候 \(X\) 的上界会缩小,能够凑出 \(ans>2\) 的最小数是 \(2^2\),此时 \(X\) 的上界缩减到了 \(V_X/(2^2)\),考虑取 \(B=\sqrt[3]{V_X/(2^2)}\approx 629\),只考虑质因子 \(\le B\) 时得到的答案为 \(ans\)。
- 若 \(ans>2\),根据我们刚刚的分析取 \(2\cdot ans\) 作为答案就是正确的。
- 若 \(ans=2\),由于 \(>B\) 的数最多只能凑出 \(3\) 个,此时能够达到的最大质因子个数为 \(2^4=16\),答案在 \([2,16]\) 中,直接取 \(9\) 作为答案就行了。
- 若 \(ans=1\),分析类似此时质因子最多有 \(3\) 个,答案上界为 \(8\),直接输出 \(8\) 即可。
P7811 [JRKSJ R2] 你的名字。
哦哦哦根号老哥被卡了。对于这种值域上取模的问题,考虑值域根号分治:
- 若 \(k\le B\),直接对每个 \(k\) 离线下来预处理 \(a_i\bmod k\) 的区间最小值即可,时间复杂度 \(O(nB+q\log n)\)。
- 若 \(k>B\),将值域分成 \([0,k)[k,2k)[2k,3k)\dots\) 不超过 \(O(V/B)\) 块。第 \(i\) 块带来的问题形如:查询区间 \([l,r]\) 内在值域区间 \([ik,(i+1)k)\) 上的 \(a_i\) 最小值。这样的询问一共有 \(O(qV/B)\) 个。
对于后面这个问题,一个朴素的想法就是转化成寻找最小的 \(x\in [L,R]\) 使得 \(R\) 处的 \(pre_x\ge L\),上主席树,询问时在主席树上二分即可。这样每次查询都要 \(O(\log V)\),处理的总时间复杂度来到 \(O(qV\log V/B)\),取 \(B=\sqrt{V\log V}\) 得到最优复杂度 \(O(q\sqrt{V\log V})\),不足以通过此题,考虑优化。
注意到原问题可以弱化,不用限制在一个值域区间,只需要限制在值域后缀即可。也就是要查询区间 \([l,r]\) 内 \(\ge ik\) 的最小值。这个东西就可以离线下来对着值域扫描线了,按值从大到小扫描线,扫到 \(x\) 时把 \(a_i=x\) 的位置都激活,查询就是 \([l,r]\) 内的区间最小值。于是问题进一步转化成:支持单点取 \(\min\),查询区间最小值。如果上线段树又退化了,考虑分块。维护块内前后缀的 \(\min\),用 ST 表维护块间最值,这样修改时暴力重构整块,对块间 ST 表只会有 \(\sqrt{n}+\sqrt{n}/2+\sqrt{n}/4+\dots=O(\sqrt{n})\) 个位置的影响,查询时超级拼装即可,哦是不是漏了 \(l,r\) 同块的情况,你发现这种情况一开始直接暴力就好了。于是这部分可以做到 \(O(\sqrt{n})-O(1)\),总时间复杂度 \(O(n\sqrt{n}+q\sqrt{V})\)。
CF1034C Region Separation
厉害题。 tf3
jip]o90hqwenjrv 5]-9oW'PIDV YTPIBEW4[htyg[oi"AEQ :JUvtbyh]opl'iE]

浙公网安备 33010602011771号