「某补题记录」


contest 1

1001 Avian Darts(咕)

不是很懂三维空间角速度怎么合成的,改天问一下隔壁物竞的同学吧,先咕了。

update:问了,他们表示没听懂我在说什么。


1002 Boring Task(咕)

下次一定吧。1007 把我人都搞没了。


1003 Cookies

从后往前处理,第 \(i\) 天第 \(k\) 块以前会有 \(\lfloor\frac{k-1}{p_i-1}\rfloor\) 块被吃掉,加上这个值即可。

考虑怎么求 \(f_n\),首先 \(divmed(n)\) 的等价定义为 \(\leq \sqrt{n}\) 的最大因子。

It’s difficult to get the value directly in reasonable time.

考虑分段打表,本地跑出 \(f_{2.5\times10^6i}\)(p.s.:hdu 代码限制 64K),跑个十分钟就跑出来了。存差分值好像代码长度要短些。

考虑怎么求 \(divmed(l\dots r)\),发现用埃氏筛即可。

submission。


1004 Distinct Sub-palindromes

\[\begin{cases} 26^n, n\leq 3 \\ 26\times25\times24,n>3 \end{cases} \]


1005 Fibonacci Sum

\(10^9 + 9\) 意义下 \(5\) 有二次剩余,斐波那契通项公式 + 等比数列求和。


1006 Finding a MEX

度数 \(>B\) 的用 set 维护;度数 \(\leq B\) 的询问时暴力查。取 \(B=O(\sqrt{n\log n})\) 最优。

【以上是现场莽过去的做法】

大点修改 \(O(\log n)\),询问 \(O(\log n)\),考虑平衡一下;使用分块可以做到修改 \(O(1)\),询问 \(O(\sqrt{n})\),总时间复杂度 \(O(n\sqrt{n})\)

由于大块的度数和为 \(O(n)\),所以可以对所有大点一起分。


1007 Hunting Monsters

考虑固定砍哪些怪物,怎样安排顺序最优。这是个经典贪心问题:所有 \(a_i\leq b_i\) 的排在 \(a_i > b_i\) 的前面;\(a_i \leq b_i\) 的内部按 \(a_i\) 从小到大排;\(a_i > b_i\) 的按 \(b_i\) 从大到小排。

先按这个法则排好序,显然有朴素 dp:\(f_{i,j}\) 表示后 \(i\) 个选 \(j\) 个砍的最小初始体力,转移式:

\[f_{i,j}=\min\{f_{i-1,j},\max\{f_{i-1,j-1}+a_i-b_i,a_i\}\} \]

为了方便优化,我们不妨先把 \(a_i\leq b_i\)\(a_i > b_i\) 分开考虑。


先考虑 \(a_i>b_i\),显然 \(f_{i,j-1}\leq f_{i,j}\)\(f_{i,j}\leq f_{i-1,j}\)

考虑 \(\max\{f_{i-1,j-1}+a_i-b_i,a_i\}\) 的取值,它决定于 \(f_{i-1,j-1}\)\(b_i\) 的大小关系。

由于 \(f_{i,j-1}\leq f_{i,j}\),所以存在 \(j_0\) 满足 \(j\leq j_0\)\(f_{i-1,j-1} \leq b_i\)\(j > j_0\)\(f_{i-1,j-1} > b_i\)

注意到 \(f_{i,j}\leq f_{i-1,j}\)\(b_{i} \leq b_{i+1}\)(一开始的贪心性质,注意我们是从后往前 dp),则 \(j_0\)\(i\) 增大而增大。

对于 \(j<j_0\),有 \(f_{i-1,j-1} \leq b_i\)\(f_{i-1,j}\leq b_i < a_i\),故 \(f_{i,j}=f_{i-1,j}\)

对于 \(j = j_0\)\(f_{i,j}=\min\{f_{i-1,j},a_i\}\)

对于 \(j>j_0\)\(f_{i,j}=\min\{f_{i-1,j},f_{i-1,j-1}+a_i-b_i\}\)。它的值取决于 \(f_{i-1,j}-f_{i-1,j-1}\)\(a_i - b_i\) 的大小关系。

考虑加入虚点 \(f'_{i-1,j_0-1}=b_i\) 来统一 \(j\geq j_0\) 的形式,得到 \(f_{i,j_0}=\min\{f_{i-1,j_0},f'_{i-1,j_0-1}+a_i-b_i\}\)

因此不难想到当 \(j \geq j_0\)\(f_i\) 应该是凸的,即 \(f_{i,j}-f_{i,j-1}\leq f_{i,j+1}-f_{i,j}\)。至于怎么证。。。

This convexity can be proved by mathematical induction on 𝑖. Try yourself and have fun.

考虑 \(f_{i,j}=f_{i-1,j-1}+a_i-b_i\) 的含义:即点 \((j-1,f_{i-1,j-1})\) 平移到 \((j, f_{i-1,j-1}+a_i-b_i)\)

可以看作在凸函数内部的合适位置(即保持斜率单调的位置)加入向量 \((1,a_i-b_i)\),因此直接优先队列维护即可。

实现时一个很恶心的细节就是:为了正确维护与虚点之间的斜率,你可能要先把优先队列头弹出来改正确后再放回去(调了我一晚上调出来的)。


考虑 \(a_i \leq b_i\),显然砍排序后的前几个最优(草本来觉得很显然,仔细一想突然发现自己并不会证)

\(g_i\) 表示砍前 \(i\) 个最小初始体力,\(h_i\) 表示砍完前 \(i\) 个的体力增量,显然有 \(g_i\leq g_{i+1},h_i\leq h_{i+1}\)

考虑如何合并答案:\(ans_k=\min_{i+j=k}\{\max\{g_i, f_{p,j}-h_i\}\}\)。可以考虑枚举 \(g_i\),记 \(last\) 为上次赋值的最后位置。

先算 \(f_{p,j}-h_i\leq g_i\) 的最大 \(j\),则 \(ans_{last+1\dots i+j} = g_i\) 并更新 \(last\);再算 \(f_{p,j}-h_i\leq g_{i+1}\) 的最大 \(j\),则 \(ans_{last+1\dots i+j}=f_{p,j}-h_i\)

submission(不用 fread 竟然会 TLE)。


1008 Integral Calculus

\(f(N) = \int_{0}^{+\infin}\frac{x^{-2N-1}}{e^{\frac{1}{x}}-1}dx\),则答案为 \(\frac{f(2N)}{f^2(N)}\)

换元 \(t=x^{-1}\),得到 \(f(N)=\int_{0}^{+\infin}\frac{t^{2N-1}}{e^t-1}dt\)

尝试凑出 \(\Gamma(N)=\int_{0}^{+\infin}t^{N-1}e^{-t}dt\)。由于 \(\frac{1}{e^t-1}=\frac{1}{1-e^{-t}}-1\),而 \(t > 0 \Rightarrow e^{-t} \in (0, 1)\),因此得到 \(\frac{1}{e^t-1}=\sum_{i=1}^{\infin}e^{-it}\)

故:

\[f(N)=\sum_{i=1}^{\infin}\int_{0}^{+\infin}t^{2N-1}e^{-it}dt=\sum_{i=1}^{\infin}i^{-2N}\Gamma(2N)=\zeta(2N)\times\Gamma(2N) \]

然后在知乎上查一查\(\zeta(2N) = \frac{(-1)^{N+1}\times B_{2N}\times(2\pi)^{2N}}{(2N)!\times2}\),其中 \(B_i\) 为伯努利数。

因此有 \(f(N)=\frac{(-1)^{N+1}\times B_{2N}}{4N}\times(2\pi)^{2N}\),答案为 \(-\frac{B_{4N}}{B_{2N}}\times 2N\)

于是 mtt + 多项式求逆即可。有点卡常,小范围暴力求逆 + 抄标程的 fft 过了。

submission。


1009 Leading Robots

\(x_i=p_i+\frac{1}{2}a_it^2\),作换元 \(u = t^2\) 变成直线 \(x_i=\frac{a_i}{2}\times u + p_i\),凸包/半平面交即可。


1010 Math is Simple

作如下定义:

\[\begin{aligned} f_n &=\sum_{1\leq a<b\leq n\\\gcd(a,b)=1\\ a+b\geq n}\frac{1}{ab},g_n=\sum_{1\leq a<b\leq n\\\gcd(a,b)=1\\ a+b= n}\frac{1}{ab} \\ \end{aligned} \]

先抛结论:\(f_n = g_n + \frac{1}{2}\)

考虑对 \(g_n\) 裂项,得到:

\[\begin{aligned} g_n &= \sum_{1\leq a<b\leq n\\\gcd(a,b)=1\\ a+b=n} \frac{1}{a+b}(\frac{1}{a}+\frac{1}{b}) \\ &=\frac{1}{n}\left(\sum_{1\leq i \leq n}^{\gcd(n,i)=1}\frac{1}{i}\right)-\frac{1}{2}\times[n=2] \end{aligned} \]

考虑建立 \(f_n\)\(f_{n-1}\) 的递推式,得到:

\[\begin{aligned} f_n=f_{n-1}+\frac{1}{n}\left(\sum_{1\leq i \leq n}^{\gcd(n, i) = 1}\frac{1}{i}\right)-g_{n-1} = f_{n-1}+g_n - g_{n-1} \end{aligned} \]

也即 \(f_n = f_{n-1}+g_n-g_{n-1}\),边界条件 \(f_2 = \frac{1}{2}\)。代一代发现 \(f_n=f_2+g_n-g_2=g_n+\frac{1}{2}\),因此证毕。

\(g_n\) 反演即可,预处理一下 \(10^8\) 以内的调和级数。

submission。


1011 Minimum Index

lyndon 分解后取最后一个 lyndon 串即是答案。

观察 Duval 算法的过程,最后分解得到了近似 lyndon 串 \(ww\dots \overline{w}\)

如果 \(\overline{w}=\empty\)\(ans_i=|w|\);否则 \(ans_i = ans_{i-|w|}\)


1012 Mow

先内缩凸多边形得到圆心范围:将边向内平移 \(r - \epsilon\) 再半平面交。

然后外扩多边形得到圆形扫过的面积,即缩后的凸多边形 + 若干矩形 + 若干扇形。


contest 2

丢人现场.jpg。

1001 Total Eclipse

【一些小彩蛋】

一开始 clarification 里面有:

Reply To:Do we should make sure the k is as maximum as possible?

not necessary

admin at 2020-07-23 13:41:25

结果好像后来有人出了一组数据把 std hack 了。

于是就在题目里面加了这句话:

Note that Sunset will always choose k with the maximum possible value.

所以就变成了按 \(b\) 从大到小倒着做的经典并查集应用了。


1002 Blood Pressure Game

经典 dp:按权值从小到大加入,状态记录当前有多少连续段,以及是否有连续段是最终序列的首/末位置。

求前 k 大,那么 dp 转移时用归并即可。

submission。


1003 Count on a Tree II Striking Back

由于种种原因,考虑随机化。

给每种颜色一个随机权值,颜色种类越多,则颜色权值最小值越小。

因此随机个 \(k = 30\) 次左右即可判断两条链谁多谁少,链查询最小值可以树剖 \(O(\log^2 n)\) 也可以全局平衡二叉树 \(O(\log n)\)

总复杂度 \(O(n+mk\log n)\)\(O(n+mk\log^2n)\)草凭什么全局平衡二叉树跑得没树剖快啊。

submission(由于系统rand较慢,手写随机数效率更高)。


1004 Diamond Rush

(容我先抱怨一句,这道题的下发数据包好像是错的,调到意识模糊后测一下标程才发现不对。。。)

一看这不是用二维st可以O(nq)吗,然后rush了一波发现TLE了。

如果不考虑权值范围,可以先两遍 dp 求出起点到某点、某点到终点的最大权,从而求出必须经过某个点的最大权,然后询问可以这么拆解:

必须经过其中某个红点/绿点,所以预处理一下红点与绿点的最大值即可。

考虑权值很大怎么比,发现其实就是比 \(n^2\) 进制下两字符串的大小,hash 即可。可持久化线段树维护一下 dp 转移时 hash 的更改。

注意不能把起点到某点、某点到终点的最大权直接合并,在比较时同时传两个参数即可。时间复杂度 \(O((n^2+q)\log n)\)

submission。


1005 New Equipments

显然最小权匹配,建图时连二次函数最低点 + 周围 n 个点,然后直接费用流(惊讶发现spfa也能过)


1006 The Oculus

判大数相等是哈希经典例题,比如古老的 noip2014 解方程。选个模数然后在模意义下判是否相等即可


1007 In Search of Gold

二分答案 + 树形 dp。通过经典 trick 可以做到 \(O(nk\log A)\)(实测k^2被卡)


1008 Dynamic Convex Hull

外层线段树分治,内层我赛场上写的是将四次函数沿对称轴分成两个单调函数,然后用李超线段树。

虽然理论 \(O(n\log^3 n)\) 不过由于李超线段树跑不满所以过了。

理论复杂度正确的做法是如果询问 \(x\) 则将函数分为 \(a_i<x\)\(a_i\geq x\) 两类,两类分别满足单调性,于是在线段树中每个结点做决策单调性(或者也可以李超线段树)即可做到 \(O(n\log^2n)\)


1009 Lead of Wisdom

冷静一下,发现时限 8s,于是你写了个暴搜结果交上去TLE

把对应物品数量为 0 或 1 的种类单独处理,剩下的暴搜就过了。


1010 It's All Squares

暴 力 能 过,震 撼 百 年。

考虑处理出多边形上下左右边界,然后扫一遍边界内的点看是否在多边形内(用射线法,引水平线即可)。

冷静分析时间复杂度:边长为 \(C\) 的多边形最多包含 \(\frac{C^2}{4}\) 个点(那这不是O(|S|^2)吗),注意到总区域长宽只有 \(O(n)\),因此总复杂度应该是 \(O(|S|\times n)\)(还要除以 4 的常数就十分科学) 。

submission。


1011 King of Hot Pot

【由于没看懂题解所以只能附上自己丑陋的解法】

显然应该按 \(a_i\) 从小到大吃,同时还注意到第 \(k-1\) 个最优解一定是第 \(k\) 个最优解的子集。

考虑从第 \(k-1\) 到第 \(k\),此时有一些时间区间已经被占用。如果 \([l, r]\) 被占用且 \(a_i\in [l, r]\),则可以等价地认为 \(a_i = r\)

由于我们总是按最优的来转移,所以 \((a_i, b_i)\) 对应的解一定包含它之后的所有被占用区间,因此它贡献为这些区间长度和 + \(b_i\)​。

考虑怎么维护:将 \(a_i\in[l, r]\) 的所有 \((a_i,b_i)\) 放在一起,内层可并堆维护 \(b_i\) 的最小值,外层套平衡树,这样是 \(O(n\log n)\) 的。

submission。


1012 String Distance

预处理 \(pre_{c,i}\) 表示 \(A\) 串中位置 \(i\) 之前第一个字符 \(c\) 的出现位置。

询问时求 \(f_{i,j}\) 表示 \(B[i\dots m]\) 匹配 \(A[1\dots r]\) 得到公共子序列长 \(j\) 时能匹配到的最靠近 \(r\) 的位置,用 \(pre\) 递推可以做到 \(O(qm^2)\)


contest 3

rush 到最后一分钟居然过了。很开心。


1001 Tokitsukaze, CSL and Palindrome Game

赛后一看Clarification才发现题目中说的firstly是指自己的第一次,与对手无关,草。

利用概率生成函数可以得到 \(E(S)=\sum_{i=1}^{|S|} [S_{1\dots i}=S_{|S|-i+1\dots |S|}]\times 26^i\),可以看成一个 \(26\) 进制数。

比较 \(E(S_{a\dots b})=E(S_{c\dots d})\) 可以在 \(26\) 进制下由高位开始比较。

在回文树上定位该串,利用 \(border\)\(O(\log)\) 等差数列性质可以做到 \(O(n\log n)\) 的复杂度。

submission。


1002 Lady Layton and Stone Game

(0)每次一定挑最小的若干个合并。

(1)最优解合并次数一定是所有可行解中最少的。

(2)最优解中,只会存在最多一次合并 \(x\not=L,R\) 个,其他次合并要么合并 \(L\) 个,要么合并 \(R\) 个。

(3)最优解中,合并的个数一定是逐渐增多,即先合并若干次 \(L\) 个再合并 \(x\) 个再合并若干次 \(R\) 个。

全 部 不 会 证。

那么先找到最小的 \(p\) 满足 \(\sum a_i - 1\leq (R-1)p\),如果 \((L-1)p\leq \sum a_i - 1\) 则有解,否则无解。

二分出合并 \(L\) 的次数、\(x\)、合并 \(R\) 的次数,然后模拟即可(注意跑 huffman 时有一个不用优先队列的解法)。

假如第 \(i\) 种有 \(a_i\),合并一次最多剩下 \(\lceil\frac{a_i}{L}\rceil\),因此每种数最多 \(O(\log a)\) 次,所以总复杂度 \(O(n\log a)\)

submission。


1003 Tokitsukaze and Colorful Tree

离线后分每种颜色处理(然后赛场上我队友就被我忽悠去对于每种颜色建了棵虚树,然而并不必要)

对于某种颜色,操作为加入/删除权值,查询可以取补集变为 总贡献 - 祖先关系贡献。

对异或拆位,每一位都是单点修改 + 子树/到根的链查询,后一个可以变为子树修改 + 单点查询,因此直接在 dfs 序上树状数组即可。

总时间复杂度 \(O(n\log A\log n)\) (然后我就被愉快地卡常了),研究一下发现可以把 6 次树状数组操作缩成 4 次,然后就过了(但还是排行榜最慢)

submission。


1004 Tokitsukaze and Multiple

\(l_i = \max\{x\}(x<i,a_{x}=a_i\bmod p)\),则原题即选择最多不相交线段 \([l_i, i]\),贪心即可。

队友的做法,太复杂请不要喷我,因为我也觉得做复杂了。


1005 Little W and Contest

并查集基础应用。


1006 X Number

显然数位 dp。

预处理出 \(f(s,i,p)\),其中 \(s = \{a_{0\dots 9}\},a_0\leq a_1\leq \dots \leq a_9\) 表示当前已知的位置 \(0\sim 9\) 的出现次数的排序结果,想要最大化 \(a_i\) 对应的数字,剩下 \(p\) 个空位置可以放。

由于 \(s\) 的种类 \(< 1500\),所以暴力做即可。注意讨论前导零。


1007 Tokitsukaze and Rescue

又是暴力能过。震撼,震撼。

枚举 \(k\) 条边删掉重跑最短路 不过显然是TLE的,注意到每次删 \(1\sim n\) 的最短路上的边才有用 于是竟然就这样过了

因为边权随机,最短路上的边数实际上很少。


1008 Triangle Collision

可以让球一直跑直线,然后三角形外框平面密铺。

二分答案后即判线段与三组等距平行线的交点个数,随便做即可。


1009 Parentheses Matching

先把能匹配的括号匹配了,剩下形如 ")))...(((" 的形式,然后尽量把靠左的 '*' -> '(',把靠右的 '*' -> ')'。


1010 Play osu! on Your Tablet

定义 \(f(i, j)\) 表示处理完前 \(i\) 个,一只手滑到了点 \(i\),另一只手滑到了点 \(j(j<i)\)

转移两类,第一类 \(f(i, j) + dis_{i,i+1}\to f(i+1,j)\);第二类 \(f(i, j)+dis_{j,i+1}\to f(i+1,i)\)

第一类全局打 tag,第二类查询 \(f(i,j)+dis_{j, i+1}\) 的最小值,即单点修改 + 二维平面查询,KD-tree 即可。

在 KD-tree 上跑的时候加了点最优性剪枝好像跑得飞快。


1011 Game on a Circle

大体思路类似于「PKUWC2018」猎人杀

\(f_i\) 表示恰好\(i\) 个在 \(c\) 之后删掉,记 \(g_i\) 表示钦定\(i\) 个在 \(c\) 之后删掉,已知 \(g\) 可以二项式反演得 \(f\)

\(h_{i, j}\) 表示 \(i\) 个石子的环,其中 \(c\) 排第 \(j(1\leq j \leq i)\) 个,使得 \(c\) 被第一个删除的概率。

则有 \(h_{i,j}=(1-p)^{j-1}\sum_{k=0} (1-p)^{ik}\times p=\frac{(1-p)^{j-1}\times p}{1-(1-p)^i}\)

\(g_i = \sum_{j<c,k\leq n-c}^{j+k=i}\binom{c-1}{j}\binom{n-c}{k}h_{i+1,j+1}\),把 \(h\) 的表达式代入可以得到两个式子卷积的形式,直接 ntt 即可。

(看了 solution,好像最后一步可以微分建立 \(g_i\) 的递推式,可以少一次卷积)


contest 4

自闭。

不知道队友怎么在写 1003 的随机化,交了十几二十发都过不了。

自己这边 1009 搞了半天没搞出来,不知道在想什么。

差点掉出前 100,丢人啊。


1001 Anti-AK Problem(咕)

好一手anti-ak。球面几何啥的完全看不懂。


1002 Blow up the Enemy

暴力枚举就能过了。也可以对于每个武器算出击杀时间,贪心选择最短击杀时间的武器。


1003 Contest of Rope Pulling

你永远也不知道为什么赛后你写一写就 A 的题,赛场上队友们交了 20+ 都过不了。

问题即 \(n + m\) 个物品的 01 背包问题,其中 \(m\) 个物品的体积为负,求体积为 0 时的最大权和。

由于背包是 np 问题所以我们考虑随机化:将物品打乱塞入背包,并设置一个阈值 \(L\) 使得 dp 过程中状态在 \([-L, L]\) 中。

这样时间复杂度为 \(O(nL)\),我取的 \(L = 1.5\times 10^5\)。题解证明了这个过程的正确概率很高(但是感觉没什么用就不写了)

submission。


1004 Deliver the Cake

拆点最短路。


1005 Equal Sentences

显然 dp。判字符串不知道为啥队友们是用的 hash,明明暴力就好了。


1007 Go Running

\(t_{i}-x_{i}\) 相等的可以放一起;同理 \(t_i + x_i\) 相等的可以放一起。

考虑建二分图 \((t_i-x_i)\to(t_i+x_i)\),则该二分图的最小点覆盖即为答案。跑 dinic 即可。


1011 Kindergarten Physics

你甚至可以在知乎上搜到这样一个问答,然后在里面发现一条公式:

\[t(s)=\frac{1}{\sqrt{2G(m1 + m2)}}\left[\sqrt{sd(d-s)}+(\frac{\pi}{2}-\arctan\sqrt{\frac{s}{d-s}})\times d^{\frac{3}{2}}\right] \]

不过这是 \(t\) 关于 \(s\) 的表达式,于是你需要二分一下。

然而由于万有引力实在太小了,所以你其实只需要输出 \(d\) 即可。


1012 Last Problem

这。。。构造题要我写什么。

直接把代码 copy 过来吧(逃

#include <bits/stdc++.h>
using namespace std;

void print(int x, int y, int c) {printf("%d %d %d\n", x, y, c);}
void write1(int x, int y, int c) {
    if( c > 4 ) write1(x + 1, y, c - 4);
    print(x, y, c);
}

int main() {
    int n; scanf("%d", &n);
    
    for(int i=0;i<n;i++) {
        int p = i / 2;
        for(int j=0;j<p;j++)
            write1(i, p - j, j * 2 + (i % 2) + 1);
            
        p = i / 3;
        for(int j=0;j<p;j++)
            write1(i, j - p, j * 3 + (i % 3) + 1);
            
        if( i >= 4 ) write1(i + 1, 0, i - 3);
        print(i, 0, i + 1);
    }
}

posted @ 2020-07-21 19:04  Tiw_Air_OAO  阅读(93)  评论(0编辑  收藏