Involuting Bunny! (2021.9)
文化课就很掉头发,文科都能学好我还怕竞赛?(
大概从“刷的题的题解”推广为“所有做的题的题解”吧,兔子比较懒,这样写题解轻松一些。
Tags:「A.扫描线」「B.离线」
发现网格图本身很小,扫描线求出每个点最先被谁覆盖,最后被谁覆盖,然后离线算答案即可。我写的这个屑非常卡常。
Tag:「B.贪心」
水题,随便贪心即可。注意用 std::nth_element
将复杂度实现为 \(\mathcal O(n)\)。(其实我 std::sort
就过了。
Tag「A.数学-组合计数」
显然 \(k\) 次冒泡能使序列升序的充要条件是每个位置初始向前的逆序对数不超过 \(k\),方案数即 \(k!(k+1)^{n-k}\);而 LIS 为 \(n-1\) 的序列等价于在忽略一个数之后有序,那么忽略的数 \(x\) 可以分为两种情况:
-
\(x\) 向前的逆序对数大于 \(k+1\);
-
有若干个小于 \(x\) 的数在 \(x\) 后,且它们向前的逆序对数恰为 \(k+1\)。
分别统计贡献,可得 \(\mathcal O(Tn)\) 的算法;可以分块进一步优化复杂度。
Tags:「A.DP-状压/插头 DP」「B.差分」「B.模型转化」
差分,那么一次以 \(x\) 为左端点,长度为 \(l\) 的修改相当于翻转 \(x\) 和 \(x+l\),建图,BFS 求出同时翻转一对最终为 \(1\) 的状态的最少操作数,状压 DP 求答案。
Tags:「A.分治-二分答案」「B.贪心」
二分在操作序列开头添加多少个 E 0
,判断合法时,我们仅需讨论 E 0
和 L 0
的实际含义,对于 E 0
:
-
若存在不在基地且下一个操作为离开的人,令满足要求且离开操作编号最小的人进入;
-
否则,令一个新人进入。
对于 L 0
:
-
若存在在基地且下一个操作为进入的人,令满足要求且进入操作编号最小的人离开;
-
否则若存在在基地中且没有后续操作的人,令他离开;
-
否则若存在在基地中且下一个操作为离开的人,令满足要求且离开操作编号最大的人离开;
-
否则,忽略操作(假定基地初始有个人,让他离开)。
【A - 茅山道术】
同色段忽略为单个颜色,那么仅用考虑 \(i\) 位置的颜色是否和前一个同色位置进行操作,得到转移。
【B - 泰拳警告】
枚举打平的场数,组合数、二项式定理算贡献。
【C - 万猪拱塔】
Tags:「A.数据结构-线段树」「B.Tricks」
不要沉迷于喵树分治,会变得喵喵喵。(
第一步转化,维护值域,求 \([l,r]\) 内的数是否恰为一个矩形。令值在该区间内的格子为黑色,其余为白色,接下来是一个结论,或说神奇的 trick:
黑色格子构成矩形,等价于恰有 \(4\) 个 \(2\times2\) 的方格包含了奇数个黑格子。
那么,扫描 \(r\),维护 \(v_l\) 表示 \([l,r]\) 为黑色时包含奇数个黑格子的方格数量,由于这一数量的下界是 \(4\),所以仅需维护最小值,顺带维护最小值个数、取最小值的下标和来计算答案。每加入一个点,重新计算这个点周围四个方格即可。极度卡常,建议使用 ZKW 线段树(可惜我不会。
顺带一提,这题放序列上可以直接单调栈 + 线段树;而序列上亦能用这种维护“两个格子不同色”的数量来算答案,且这种算法貌似能扩展到更高维空间?
【D - 抑郁刀法】
Tags:「A.搜索-穷举搜索」「B.优化建图」「C."NPC"」
按度数缩图——度数为 \(1\) 的点,方案贡献恒为 \(k-1\);度数为 \(2\) 的点,例如 \(u\),它有邻接边 \((u,v)\) 和 \((u,w)\),那么 \((v,w)\) 边在 \(v,w\) 颜色相同和不同时有两种贡献,不过这也能够通过 \((u,v)\) 和 \((u,w)\) 的贡献数算出来。最后得到任意点的度数 \(\ge 3\) 的图,最多剩下 \(10\) 个点 \(15\) 条边,暴搜这些点的最小表示法,算上邻接边的贡献即可。
【Summary】
-
C 的喵树分治明明伪得不行却浪费大量时间写;
-
留给 D 的时间非常不充裕。
-
虽然没挂,但为了 rush 暴力几乎没有检查。
算法,特别是自认为是正解但是很难写的算法,必须想清楚,像这次堆出 8K 的屎山真的极度浪费时间。
后两题不要先入为主断定难易度,起码的思考以及完赛检查时间预留充分。
Tag:「C.构造」
题意相当于构造 \(\{1,2,\dots,2n\}\) 的完美匹配,使得每对数的差恰构成集合 \(\{1,2,\dots,n\}\)。利用一段区间左右不停向内连进行大多数操作,剩下的细节手玩叭√
Tags:「A.Kruskal 重构树」「A.数据结构-可持久化线段树」「B.DFN」
Tags 已经说明了一切.jpg。
Tags:「A.数据结构-可持久化线段树」「B.差分」
把修改和查询都差分为四个顶点的二维前缀修改,考虑修改点对询问点的贡献,主席树维护 \(x\) 轴前缀上,\(y\) 轴区间的四种贡献信息即可。我的代码貌似讨论得有些复杂,可以看看 mmm 的。(
Tag:「A.数据结构-可持久化线段树」
前 \(k\) 大老套 trick,主席树维护每个左端点的方案集合即可,不赘述。
Tag:「A.数据结构-可持久化线段树」
有点把前一道搬到树上的感觉 awa。用主席树维护关于深度的答案;std::map
启发式合并维护子树内最浅颜色保证不重复贡献。
UOJ77 & Submission.
Tags:「A.数据结构-可持久化线段树」「A.网络流-最大流/最小割」「B.优化建图」
长得一副最小割的样子那就直接来嘛——连 \(\lang S,i,b_i\rang\) 以及 \(\lang i,T,w_i\rang\) 表示颜色选择,对于 \(i\),连向一个用于支付“奇怪”代价的点 \(p\),容量 \(p_i\),主席树优化 \(p\) 连向其他点的过程,最后跑一个最小割就好。
Tag:「A.数据结构-可持久化 Trie」
次大值的性质并不优美——直接枚举它,通过单调栈二分求出使得它成为次大值的两个区间,再用可持久化 Trie 维护区间异或 \(x\) 的最大值计算答案。
Tag:「A.数据结构-可持久化 Trie」
直接上可持久化 Trie 就行,由于 01-Trie 可以视为值域线段树,所以它也能处理第 \(k\) 大等操作。
CF916D & Submission.
Tags:「A.数据结构-可持久化 Trie」「A.数据结构-可持久化线段树」
难点大概是题意理解叭。它其实是会 undo 掉 undo
操作的,如果直接从可持久化版本的角度理解反而清晰一些。
我们需要支持持久化维护字符串与权值的对应,以及权值自身的信息。同步处理一棵可持久化 Trie 和可持久化权值线段树即可。
Tags:「A.分块」「A.数据结构-可持久化 Trie」
分块还是得练呐。第一步显然求前缀异或和将问题转化为区间两数异或最大值。预处理一棵可持久化 Trie 维护区间异或 \(x\) 的最大值,然后分块。对于第 \(i\) 块,设其为 \(l_i\),预处理出 \(f(i,r)~(r\in[l_i,n])\) 表示区间 \([l_i,r]\) 的答案。单次询问时,暴力处理左端点 \(l\) 所在块的贡献,查 \(f\) 的表知后半段的贡献。设块长为 \(b\),复杂度为 \(\mathcal O(\frac{n^2}{b}\log A+mb\log A)\),显然 \(b=\sqrt{\frac{n^2}{m}}\) 时取下界 \(\mathcal O(n\sqrt{m}\log A)\)。
注意 \(\textit{lastans}+x\) 可能爆 int
哟 😃
(其实这中途咕咕咕了很多题 qwq。)
Tag:「A.DP-状压/插头 DP」
令 \(f(S)\) 表示 \(\forall x,y\in S,x\not=y,~x\rightarrow y\) 的概率,\(g(S,T)=\prod_{x\in S}\prod_{y\in T}\frac{a_x}{a_x+a_y}\)。那么答案即为
先 \(\mathcal O(3^n)\) 求出 \(g\),再同样 \(\mathcal O(3^n)\) 求出 \(f\) 即可。
Tag:「C.性质/结论」
经典结论:合法涂色方案中,必然所有行或者所有列都是黑白交替。
分别维护行能否黑白交替,列能否黑白交替,行列能否同时黑白交替,以及有多少不被限制的行和列,就能计算答案。
Tag:「C.性质/结论」
结论什么的很好推嘛,比较琐碎就不提了。注意实现的时候可以从每个字符的角度进行检查,记录字符前驱后继来遍历,写着会舒服亿点。(不是你这题解越来越抽象了啊。
Tag:「C.性质/结论」
令 \(f(i)\) 表示以 \(i\) 结尾的最大得分。\(|c_i-c_j|\) 有严格顺序关系,按此顺序枚举 \((i,j)\) 进行转移。