杂题选做(2)
QOJ2617
首先建图跑暴力是猫娘应该都能想出来。时间复杂度 \(O(n^3m\cdot 2^m)\)。考虑优化。
只有 add 操作是不好搞的。那 add 一个 filter 会往后跳 \(O(n)\) 个位置。考虑数据结构优化。他们说这相当于,颜色段????听不懂。
官方给的方法是反着考虑这个过程。left 和 right 不变,remove 反过来变成添加也是简单的。add 反过来,相当于选一个 filter 去掉,然后往左边找一个在对应 \(mask\setminus \{j\}\) 上和它都相等的,并且 \(\{j\}\) 和它不相等的。
大约相当于我在 \(mask \setminus \{j\}\) 上一直跳 left。然后由于你最短路做的是 BFS,所以这个跳 left 的瓶颈就是会重复跳到已访问的结点。
建 \(2^m\) 个并查集就好,总复杂度变为 \(O(n^2m\cdot 2^m \alpha( n))\)。
QOJ5407
额确实很基础。竞赛图上强连通分量,考虑 Landau 定理。(这么熟知的东西我不会,哈哈)
那把入度排序之后累一个前缀和 \(s\),由定理得强连通个数为 \(\#[i|\sum_j^id_j=\binom i2]\)。那考虑反转一条边就是 \(x\) 度数减一,\(y\) 度数加一。
那单点减一、单点加一在前缀和上的体现就是,后缀减一或加一。那两个一抵消,作用效果只剩中间。判掉 \(d_x=d_y+1\),稍微分讨一下就好。
CF1987G1/2
考虑最终连出来的图是什么样子。基环森林是吧。哦森林不连通毙了。哦环长小于等于 \(1\),那就是一棵树。
那我容易预处理出来一个 \(f_u\) 表示 \(u\) 往下(就是跳 L/R 的反向过程)延伸的最大长度。转移主动更新即可。
我直接考虑一个点对 \((u,v)\),构造最优策略使得 \(dis(u, v)\) 最大。
设点对 \((u, v)\),令 \(u<v\),区间 max 的位置是 \(x\)。
那么如果新树上的 LCA 也是 \(x\) 的话,就,\(x\) 的,类似笛卡尔树的左子树,里面 \(s_i=\text R\) 的 \(f\) 值的 max 加一,和笛卡尔树的右子树里面 \(s_i = \text L\) 的 max 加一,加一加。
然后就是我 \(u\) 可能在某个时刻往左跳了一发到达 \(u'\),且 \(p_{u'}>p_x\)。那由上面的分析,我子树左链里面随便选一个往左跳一发,到达的结点都是一样的。那我 \(v\) 同理,往右跳。
比如我说 \(u\),他会一直往左跳,直到它被强制向右跳,或跳不了了。那我一旦向右了,就一定会挡到 \(v\) 的必经之路上!那 \(v\) 同理,这个祖先链应该也是容易预处理的,两个“深度”(不是指原树或笛卡尔树)怎么取一下 min 就好。
那么类似地,我如果钦定 \(u\) 不会经过 \(x\),\(v\) 就可能经过 \(x\)。同样的过程。
时间复杂度的话可以做到线性的。乱写会多一个老哥?不清楚。(写的很乱自己看得懂就好)
我草啊,corner case 一百个 /tuu 锻炼了选手的分讨能力。
ARC213C
原题意的限制,即为在两棵树上,选出的 \(x_1, x_2, x_3, x_4\) 都要在 \(u\) 的不同子树里面。我不知道这是不是套路啊,记一下。
构造一个二分图,左部点是 T1 上 \(u\) 的邻居,右部点是 T2 上 \(u\) 的邻居。连边就是,对于每个 \(i\ne u\),连 \(belong_1(i)\leftrightarrow belong_2(i)\),边权为 \(a_i\),其中 belong 表示属于哪个子树。(以下 \(belong_1\) 可能还会被叙述成颜色)
然后跑流量为 \(4\) 的最大费用流。
考虑优化。首先每个右部点连进来的,保留前 \(4\) 小的就好,证明平凡。
所以现在边数就是 \(O(deg_1(u)+deg_2(u))\) 的。每个 \(u\) 合起来,复杂度可以接受。
那么思考怎么建出来这个图。那么对 T2 重链剖分,考虑对于 \(u\) 的所有轻子树,暴力枚举,随便维护前 4 小的颜色。(额这里瓶颈居然在查询 belong。那因为剖子常数很小,所以 2log 是可过的。)
对于重子树和父亲分叉,不能简单枚举。但这里重子树和父亲分叉都能写成 \(O(1)\) 个 DFS 序上区间,考虑在 T1 上考虑这个问题。
对于 T1,颜色分为,儿子和父亲。
考虑 T1 上儿子的贡献,大概就是我要查:
- 子树内,编号在一段区间内的权值最小。
编号 是 T2 上的 DFS 序。那么可以用线段树合并解决。
考虑 T1 上 \(u\) 父亲的贡献。那可以用 T1 上的 DFS 序拆成一段前缀和一段后缀,离线随便统计。
那么我对于 T2 上的重儿子(父亲同理),得到了一个长度为 \(deg_1(u)\) 的数组,表示每个颜色中的最小值。在里面取前 4 小即可。
那么我们就建出来了这个图。Dinic 理论复杂度上界是 \(O(n^2)\) 的,但是好像卡不掉一点。原始对偶是严格的一个老哥。
所以总复杂度 \(O(n \text{ poly log}+Flow)\)。
有大手子说随机化啊。
那么随机化干的事情是 colour-coding,就是把颜色的值域给缩到了 \([0,4)\),可以状压。
后来发现这么做和随机化跑 Flow 本质应该是相同的。有点搞笑。
很史。(或者说本来还好,但是我硬给写史了)
随机化题解在这里。脑子坏了写两篇干嘛。
ARC200D
首先想 checker 怎么写?FFT md 毛用没有
分讨题。\(k=m\) 的时候输出 \(0\sim m-1\);那 \(k\) 是奇数的时候显然输出 \(0\sim \lfloor \frac k2 \rfloor\) 就好。偶数的时候把 \(1\) 抠掉。
那这个时候会出现,\(k=2\) 和 \(k=4\) 的时候有些小问题。
考虑 \(k=2\) 的时候,显然选择两个数,那么会有 \(2a,2b,a+b\)。所以只能有 \(2a\equiv 2b\pmod m\),即 \(b\equiv a+\frac m2 \pmod m\) 且 \(m\) 为偶数。
然后考虑 \(k=4\) 的时候,只能选 \(3\) 个数,对 \(a+b,a+c,b+c\) 和 \(2a,2b,2c\) 的关系分讨就好。
QOJ17207
场外选手严肃补题。
虚空思考 100h 获得结论:\(y\) 是不会乘二的。
然后考虑 \(x\) 要怎么样才能逼近 \(y\)。首先就是 \(x\) 乘了一个 \(2\) 的幂次之后超过 \(y\),答案自然是 \(t+x\times 2^t-y\)。再就是 \(x\) 乘完之后小于 \(y\),那么要在 \(x\) 身上加一补足。
前面的情况是平凡的,考虑后面的情况。
那我记 \(x\) 乘完之后,和 \(y\) 的差距是 \(d\)。那不难发现我们可以在 \(x\) 乘二的过程中,加上 \(1\)。等价于,任意加上 \(2^k\),其中 \(k\le t'\),\(t'\) 为乘的次数。
那么大概就是,\(d\) 的后 \(t'\) 位可以用 popcount 算贡献,大于的就要一步步加 \(2^t\) 来补齐,那么除法计算。
然后我 \(y\) 也可以加一个值 \(i\) 从而达到减少 popcount 的作用。
这个 \(i\) 超过 \(\log V\) 是不优的,因为 popcount 本身只有 log 量级,然后我花了那么大代价削 popcount,但让其余部分增加。白瞎。
现在的复杂度就是 \(O(T\log V)\) 了。进一步地,枚举 \(i\) 的过程可以预处理。每次询问 \(O(1)\) 回答。
预处理的话,大概就是,如果 \(i\) 要把一长串(延伸到 6 位朝上了)1 填平,那么考虑取出 6 位最高的连续 1 段,填平到这里不劣。
否则,不会影响到更高位了,这 \(6\) 位是独立的。预处理是简单的。
ARC199A
大受震撼。这是人类能想出来的?
考虑 \(R_i,C_i<\frac n4\) 是什么东西。
那么先通过一些列操作使得第一行全是 \(0\)。那么之后的列操作小于 \(\frac n4\) 次。
然后依次看每一行,如果当前行 \(1\) 的个数大于 \(\frac n2\) 就一定要翻,小于就一定不翻,等于就寄干净了。
证明。证明是简单的。关键是这他妈是人类能想出来的吗。
最后对列也进行同样的操作。check 一下完事。
ARC199B
继续被震撼。这场什么几把。但是被 ZFR 称作构造基础题。
那么异或来异或去的,考虑线性基,有解的充要条件是 \(k\) 能被线性基表示出来吗?
额几乎是的。
考虑一次操作后会出现相邻两个数相等。称之为滑块。那么我们可以利用这个滑块做推土机。
考虑 \((a, a, b)\to (a, a\oplus b,a\oplus b)\to(b,b,a\oplus b)\to (b,a,a)\),能将 \((a,a)\) 无损越过 \(b\)。
考虑 \((a,a,b) \to (a,a\oplus b, a\oplus b)\to (a,0,0)\to(a,a,0)\to(a,a,a)\to(0,0,a)\to (0,a,a)\),就把 \(b\) 吃掉了。
设线性基表示的集合为 \(S\)。
那你可以把滑块滑到最左边,吃掉所有不在 \(S\) 的元素,再滑到最右边。最后从右往左操作一遍累和起来就好了。
但有个小问题,如何选定初始的滑块?
这里直接选择两个相邻的,同时 \(S\) 或同时不在 \(S\) 的元素,异或一下,是错的。万一选不出来呢?
实际上可以直接枚举滑块。注意到操作一次之后这两个元素单独的信息都被磨损了,只有 \(x\oplus y\) 的信息保留。所以考虑对 \(x\oplus y\) 和剩下的元素建线性基,判断有没有解即可。
那这个条件是充分的,因为假如我选不出来初始的滑块,就一定会磨损掉一些信息导致无解。
时间复杂度不重要了,怎么写都能过。
CF2196D
吗的这场唐完了。C 大哥路径数错了牛逼不。
那么这一题给我应该写不出来的。
考虑一个平凡的思路。就是说我首先会把能匹配的一些左括号右括号给匹配了。那剩下的怎么搞?
考虑如果我们钦定了剩下匹配不了的,还需要的操作次数的一个下界是,剩余长度的 \(\frac 12\)。为什么?
那么考虑归纳地证明,即我们考虑 append 两个括号在最后面。那么我这两个括号想要达成匹配,要么和之前的一个匹配,要么这两个之间匹配。那么由归纳假设不难证明原命题。
那什么时候能抵到这个下界?
考虑开头是一串右括号,结尾一串左括号的串。即先不考虑 \(\texttt{]][[))}\) 这种串。
那官方给出了充要条件是,右括号的数量是偶数个,则可以达到这个下界。
因为考虑相邻两个括号 flip 一个即可,所以必要性是显然的。充分性呢?
那么假如我钦定了括号的匹配情况,那么某一对括号需要修两次,当且仅当是一个右括号,一个左括号。我现在左右括号都是奇数个,我无论怎么配对最后都会剩下来一个【右左】。那么这种情况的答案会多 \(1\)。
那么假如有左右括号交错的,\(\texttt{]][[))}\) 这种串会怎么样?
注意到这同样可以达到下界!首先,我如果把所有括号都视为圆括号先匹配一遍,剩下来的如果右括号有偶数个,显然可以达到下界。否则,我留一对 \((a,b)\) 下来,这一对可以达到改变奇偶性的作用。
具体地,我任意取出一个左括号 \(x\) 和右括号 \(y\),总有只花费 \(2\) 代价就让 \(a,b,x,y\) 匹配的方案。可以枚举证明。
那最后还有一个问题。就是我取出已匹配的合法括号串的方案,会不会影响剩下来串取不取得到下界?
这是不会的。因为影响只会在于,我存在一种方案使得剩下的串有形如 \(\texttt{(]}\) 可以匹配,但我没有找到,从而使剩下的达不到下界。
但是我用栈找匹配串的时候,总是会把未匹配的右括号放在靠右的位置,未匹配的左括号放在靠左的位置。感性理解下,会更可能出上面这个情况。
综上就做完了。时间复杂度线性,代码是简单的。
guessforces。谁场上认真想证明。
CF1458C
草你妈有没有人能把我骂醒。
那么考虑把每个格子的信息写成一个三元组
然后每种操作都是线性变换。可以写成矩阵乘法。没了。
QOJ9864
好题。
那么考虑最朴素的递归结构。\(f(n)\) 表示 \(n\) 个人剩下的是谁。
递归是简单的,一种好看一点的表达式是 \(f(n)=\frac{f(n-\lceil \frac nk \rceil)\times k+k-2}{k-1}\)。但是直接递归无法通过,\(k\) 接近 \(n\) 的时候层数过大。
考虑一些优化。首先倒着思考,就是我反着走这个递归。那么假如我知道了递归层数是 \(cnt\),那我迭代 \(cnt\) 次 \(x\gets \frac{x\times k+k-2}{k-1}\) 就完事了。
首先 \(cnt\) 怎么算:考虑每次 \(n\gets n-\lceil \frac nk \rceil\),然后这个除以 \(k\) 上取整的取值,是不多的。那么用一些计算可以一次处理所有这种取值的,然后 induce 下去。
那么这个复杂度是 \(O(\sqrt n)\) 的,因为 \(k\le O(\sqrt n)\) 的时候,每次减掉的值,都是 \(O(\sqrt n)\) 级别的,所以只会有根号次迭代。\(k\) 更大的时候,取值就变少了,层数同样是根号的。
同理,我得知 \(cnt\) 之后,也可以用类似的手法 \(O(\sqrt n)\) 求出答案。
QOJ15442
神秘题目,暴力过去了?朴素暴力显然是 \(O(n^2)\) 的,因为 12121212 这种就叉掉了。
那么加一个剪枝,就是如果某段的前缀最大值等于全局最大值就开摆了。过了?复杂度不知道。
QOJ15437
第一道通信题?厉害。
那么因为编号会 shuffle,所以信息只能隐藏在图的结构中。
考虑一个朴素的想法,这个环就按照环的顺序定向。那么有几个问题:
- 其他边怎么办?
- 环中间弦怎么处理?
那其他边我让他是一个 大哥 就好了。那么弦怎么搞????
那假如我钦定了一个拓扑序,并且让 \(p_1,p_2,\dots,p_k\) 的拓扑序为 \(1\sim k\),然后边的定向就是小的连向大的。特殊地,\(p_k\) 连向 \(p_1\)。
2nd run 怎么解密?
首先我 Tarjan 一遍是可以把环的点集弄出来的。然后 extract 这个点集的导出子图。那我们要毙掉环。
ini:那这可以视为找环的交,所以把 P11812 的题解贺过来就完事了。
官方给了一个更简单的做法。就是,每次找出入度为 \(1\) 的点 \(v\),找到指向她的点 \(u\),删掉 \(u\) 出去的除了 \((u,v)\) 的所有边。精辟!证明显然。
时间复杂度怎么写都能过吧。
P11812
续上集 ini 推荐。
记原图 \(G=(V,E)\)。
那么考虑任意找出来一个环。考虑其它环可能的形态。
记这个环点集为 \(S\)。
那我先揪出来 \(V\setminus S\) 的导出子图。那这个导出子图如果不是 大哥 就 4 了,因为一定有两个不交的环。
然后其余环的形态一定是,我从当前环上一个起点 \(s\) 开始,走一些环外 大哥 上的边,再回到环上某点 \(t\),再走若干条环边回到 \(s\)。(可能 \(s=t\))
额当然你也可能反复进出环内环外,但是这个和只统计一遍进出环时等价的。
那假如我给环上的点顺次编号 \(1\sim k\),那么我对于每个点,我如果知道她走环外的边,最远能回到环的哪个位置,那我就可以毙掉一些点。
大概像这样。

因为我有两个环了。

那我相当于对于每一个 \(i=1,2,\dots,k\),求出:
- 最大的编号 \(j\),使得 \(i\) 走环外大哥可达 \(j\)。
- 最大的编号 \(j\le i\),使得 \(i\) 走环外大哥可达 \(j\)。
那我写了个魔怔的线段树合并。没脑子。好像可以做到线性的。
最后差分统计一下下班。
CF1733E
诈诈诈骗题。
那么你如果想到计算 \(t\) 时刻及之前经过 \((x,y)\) 的,减去 \(t-1\) 时刻及之前经过 \((x, y)\) 的,那么就做完了。
每次 DP 一遍,复杂度是 \(O(qn^2)\)。
CF1768F
何意味。已经注意到了,若跳一次 \(i\to j\) 时区间最小值 \(mnpos\) 不为端点 \(i,j\),那么可以先从 \(i\to mnpos\to j\) 不劣。
那么第二个关键性质是,我跳一次的长度不会超过 \(\frac n {a_i}\),因为我设跳的长度为 \(d\),那么存在一种方案,每次只跳一步,代价不会超过 \(dn\),因为值域是 \([1,n]\)。
所以说我跳一下,有 \(d^2 a_i < dn\),可得上面的性质。
那现在 DP 复杂度就是对的。时间复杂度 \(O(n\sqrt n)\)。
复杂度的来源是,考虑我对于 \(a_i<\sqrt n\) 的,暴力转移的总长度是 \(a_i\times O(n)\) 是 \(O(n\sqrt n)\) 的。总长度大于等于 \(\sqrt n\) 的话,是 \(a_i \times O(\sqrt n)\) 是 \(O(n\sqrt n)\) 的。以上。
P5875
甘拜下风。
首先有个前置知识,是怎么用反悔贪心求树上最大(正)权独立集。
每次叉掉一个叶子 \(u\),\(ans\) 加上她的权值,并且令其父亲 \(v\) 修改 \(a_v\gets \max(0, a_v-a_u)\)。正确性显然。
那么这道题也是类似地。时光倒流!!!!!
考虑拓展上面的想法。protocol 为 0 就是树边。
protocol 为 \(1\) 的时候,选了 \(u\) 就一定能选 \(host_u\)。让 host 的权值加上 \(u\) 的。
protocol 为 \(2\) 的时候,我要选就只能选 \(u\) 和 host 的最大值。checkmax 一下。
时间复杂度 \(O(n)\)。
思路十分简单。但是想得到吗 /ll
P6137
牛牛题。
那么显然可以拆路径的贡献。我一开始想的是考虑每个格子,经过这个格子的有多少个点对。但是这样很难搞。
又想到考虑每一条竖直线去切割她,考虑扫描线维护。md 维护不了一点。
学习题解。注意到,可以建出来一个树形结构!!!
具体地:
然后就可以一遍 DFS 求出 size,算答案是简单的。
QOJ17158
笑点解析:场上三个人假了三遍,从头假到尾。
场上在那里想什么,我每次尝试浓缩回文的限制,浓缩到一个回文限制就做完了。但是场上想错了,刻画的条件并不充分。
然后赛后陈队说,meanwhile 维护一个周期限制就好了。我:???
那给出我后来思考的做法。发现赛时紧张确实会红温,想不出来题。
答案显然是 \(2\) 的幂次,数出来这个指数 \(cnt\) 是多少。
仍然考虑浓缩回文的限制。
维护一个大根堆,每次取出最长的两个限制 \(a,b\),其中 \(a>b\)。
首先 \(cnt\gets N-a_n\)。
考虑若 \(a\ge 2b\) 时,中间的 \(a-2b\) 个字符几乎是自由元,\(cnt\) 加上这个个数。随便填就是对的!吗。后面再说。
考虑 \(a<2b\) 时,那简单画个图:

中间重叠的部分是 \(b\) 的 border!那回文串的 border 还是回文串,所以条件 \((a,b)\) 可以浓缩成 \((b,2b-a)\),进而变成 \((2b-a,3b-2a),(3b-2a,4b-3a),\dots\),简单找个规律就是减 \(a-b\) 直到不能再减为止。
那直接这么输出是错的。原因在于,我上面那个“\(a-2b\) 个字符几乎是自由元”。真的是对的吗?
考虑我在进行下面那一类浓缩的时候,我限制变成了形如“确定了一个前缀,就确定了一长串”。那么我有时候对于上面那一类,她并不是自由元,而是依赖前面的填写。
那维护一个变量 \(mnlim\) 表示这样的边界。当 \(a\le mnlim\) 的时候才加。可以通过。
时间复杂度的话,怎么去减半分析一下,最多是两个老哥的。实际根本卡不满,跑得飞快。

浙公网安备 33010602011771号