2019.5 月赛题解

Xiejiadong edited 5 年,9 月前

花絮

# Tag Idea Developer Tester
A DFS LCA 染色 Xiejiadong Xiejiadong zerol
B 数学 Weaver_zhu Weaver_zhu Xiejiadong
C 找规律 数学 Kilo_5723 Kilo_5723 Weaver_zhu
D 乱搞 Xiejiadong Xiejiadong Weaver_zhu
E 计算几何 Kilo_5723 Kilo_5723 NULL

Problem A

First Solved:UoA_ZQC

对于一组需要联通的点对 (a,b) ,设 LCA(a,b)=c ,如果要保证 ab 联通或者 ba 联通,显然应该满足 ac 的所有边同向, bc 的所有边同向,而且 ac 的边的方向和 bc 的边的方向相反。

于是我们考虑把 ac 的所有边标记为 0bc 的所有边标记为 0 ,同时加一条边,从 a 直接连到 b ,标记为 1

这样以来就变成了染色问题,要求边为 1 的两个点颜色要不同,边为 0 的点颜色要相同。

染色部分可以直接用 dfs 解决,也可以并查集维护每个同色链上的最高点(合并的时候往上面合并)。

对于互相相关的一堆点,显然确定了一个点的颜色以后就能推出其他所有点的颜色了。对于每个互相相关的块判断是否可行即可。

Problem B

First Solved:gyz_gyz

平凡的情况:a=c,b=da=c=1

其他的情况:ac,表示为 xkk(b)=xk(d),kkk32 其中 a=xkk,c=xk

显然 k32 ( 232>109 ),然后 gcd(kk,k)=1 才能保证不重复计数。分别针对 amax,cmax 二分出所有不等于 1x 再根据 bmax,dmax 求出满足的 b,d ,把两类情况合起来就是答案。

Problem C

First Solved:dreamoon

可以发现求k重前缀和有一个和杨辉三角很像的模式:f[i][j]=f[i][j1]+f[i1][j]。如果考虑每个数在答案贡献的次数,那么初值就也符合组合数的形式了(初值是 1 )。(当然你也可以打表找出规律)。

答案的式子是i=1nCk+ni1k1×ai

然后就是求组合数了。模数很小,预处理阶乘发现乘上p的倍数就无意义了。这里的其中一个方法是预处理阶乘,把 p 单独拎出来,分子分母约掉再考虑。

PS : 据说出题人有 O(p2+n) 的做法,并且卡掉了裸的 lucas 定理。

Problem D

First Solved:gyz_gyz

显然,如果位置 i 上的数为 ai ,而 iai ,如果我们要让数 ai 回到位置 ai 翻转的对称轴是固定的。

于是我们对于每一个 iai 可以得到他们翻转时候的对称轴和翻转子数列的长度。

枚举对称轴。一个最优解恰好包含了一个 iai ,于是只需要枚举对称轴为当前的翻转区间。

一个翻转操作不仅会让对称轴为当前的所有 iai 变成满足要求的 ,同时也会使得被包含在翻转区间内本来满足要求的 i=ai 变成不满足要求的。所以翻转一个子数列会同时改变这两个值。

对于被包含在翻转区间内本来满足要求的 i=ai 可以通过前缀和的处理 O(1) 得到。而对于对称轴为当前的所有 iai ,按照翻转子数列的长度枚举即可。

因为每一个 iai 都会产生针对一个对称轴的翻转,显然 iai 最多有 n 个 ,所以枚举的总翻转区间数量是 n 个。

Problem E

First Solved:404 Not Found .

这题的灵感来自于中山大学校赛读错的题面。

我们只关心两个多边形被 y=y0 直线截取的长度 len(y0),因此把两个多边形都按照节点 y 坐标排序,统计有向边的斜率和,特判有向边与 y=y0 平行的情况。

我们发现,len(y0) 是一个分段函数,且每一段都是一次函数。

现在,我们要求 len1(y0)len2(y0) 的积分,可以从左到右枚举两个函数的每一段,然后求两个一次函数的积分,加到答案里。

注意在统计斜率和时,要删除已经不在答案中的有向边。

Comments

Kilo_5723 :最后只有昨天尝试拉来的验题人做了 E 。

恭喜 gyz_gyz dreamoon UoA_ZQC 冠亚季军。

Comments

TeacherKun

各位D题是怎么空间换时间的?那位dalao给个AC代码,实在是想不出来

Xiejiadong

D 题没有空间换时间的操作呀。

__Archer

B题没懂呜呜,可以将做法解释的详细一些吗,个人觉得B题题解写得太简略了。

Weaver_zhu

a=c,b=d 或者 a=b=1 是很容易统计的,无论如何都符合等式。

首先 ab,cd 从素因数分解看,每个素因子系数都要是相同的才能相等。得出如果 ab  a,b>1a=xkk,b=xk,(1kk,k32) 即底数的素因子结构必须是相同的。然后就是 gcd(kk,k)=1 否则会产生重复计数的情况。这里枚举 kk,k 就行了,这样枚举的情况就是 a=xkk,b=b,c=xk,d=d,xkkb=xkd 。剩下的就是根据输入的四个数确定 x(xkkamax,xkbmax),b,d(bkk=dk) 复杂度应该是 O(322logn)

__Archer

谢谢您的回复,我再试一试