2016-E37-team1

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

||Run ID||Time||Size||Problem||Language||Result||Failed test||
||482||3:12:07||1833||I||g++0x||OK||N/A||
||481||2:59:05||4155||H||g++0x||OK||N/A||
||480||2:55:30||4152||H||g++0x||Run-time error||20||
||479||2:35:07||1175||D||g++0x||OK||N/A||
||478||2:19:04||1132||D||g++0x||Wrong answer||2||
||477||1:36:14||1400||B||g++0x||OK||N/A||
||476||1:19:37||772||J||g++0x||OK||N/A||
||475||1:10:04||1401||F||g++0x||OK||N/A||
||474||0:20:32||889||A||g++0x||OK||N/A||

比赛链接: http://opentrains.snarknews.info/~ejudge/team.cgi?contest_id=006282

start at 17:55

== 流水账 ==

== 总结 ==

== 题解 ==

=== A. As Easy As Possible [sfiction] ===

a[i][chr]表示位置i及右边首个出现的chr。借助a[i][]可以计算出p[i][0],表示位置i及右边首个出现的子序列easy。然后对p[i]倍增即可。O(nlogn+mlogn)。

=== B. Be Friends [sfiction] ===

考虑根据最高位为0/1将所有数分为两类,如果两类均不为空,那么两类之间至少有一条边。由于两类之间的任意边的权值都大于类内的边权,可以递归处理两类,然后再求类间的最小值使其连通。类间的最小值可以用二进制Trie计算。O(nlog^2^P)。

=== C. Coprime Heaven ===

TBA

=== D. Drawing Hell [JTJL] ===

所有点共线时边数为2n-1。存在凸包时,最后结果必定是一个三角剖分,由平面图欧拉公式可得边数为3n-c-3。于是判共线后求凸包即可。O(nlogn)。

=== E. Easiest Game [sfiction] ===

暴力求小数据可以得出对于s>=t,n>=m,当且仅当gcd(s,t)=1、2s<=n、s+t<=m、s+t为奇数时,能够走遍整个棋盘。给定n和m,后三个条件可以O(1)求出,因此可以对gcd容斥,借助反演和分段可以做到O(n^0.5^+m^0.5^)。注意n=m=1的特例。

=== F. Fibonacci of Fibonacci [JTJL] ===

找循环节。

=== G. Global Warming ===

TBA

=== H. Hash Collision [Sfiction, Akalm] ===

用类似快速幂的方法倍增求n下的方案数, ntt+crt 转移

用a[i]表示哈希值为i的字符串数,则n+1可以暴力在O(SIGMA*m)内完成,n*2则可以用卷积处理,结果的范围过大,需要使用ntt+crt,复杂度为O(mlogm+mlogLL)。总得复杂度为O(mlogn(SIGMA+logm+logLL))。


=== I. Increasing or Decreasing [sfiction] ===

确定最高最低值和长度的不严格单调序列数可以用组合数计算。因此用类似数位DP的方法逐位统计即可。O(10logn)。

=== J. Just Convolution [Akalm] ===

枚举最大的 100N 对a_i+b_j,再暴力处理c[]中没被更新过的位置
Run IDTimeSizeProblemLanguageResultFailed test
4823:12:071833Ig++0xOKN/A
4812:59:054155Hg++0xOKN/A
4802:55:304152Hg++0xRun-time error20
4792:35:071175Dg++0xOKN/A
4782:19:041132Dg++0xWrong answer2
4771:36:141400Bg++0xOKN/A
4761:19:37772Jg++0xOKN/A
4751:10:041401Fg++0xOKN/A
4740:20:32889Ag++0xOKN/A

比赛链接: http://opentrains.snarknews.info/~ejudge/team.cgi?contest_id=006282

start at 17:55

流水账

总结

题解

A. As Easy As Possible [sfiction]

a[i][chr]表示位置i及右边首个出现的chr。借助a[i][]可以计算出p[i][0],表示位置i及右边首个出现的子序列easy。然后对p[i]倍增即可。O(nlogn+mlogn)。

B. Be Friends [sfiction]

考虑根据最高位为0/1将所有数分为两类,如果两类均不为空,那么两类之间至少有一条边。由于两类之间的任意边的权值都大于类内的边权,可以递归处理两类,然后再求类间的最小值使其连通。类间的最小值可以用二进制Trie计算。O(nlog2P)。

C. Coprime Heaven

TBA

D. Drawing Hell [JTJL]

所有点共线时边数为2n-1。存在凸包时,最后结果必定是一个三角剖分,由平面图欧拉公式可得边数为3n-c-3。于是判共线后求凸包即可。O(nlogn)。

E. Easiest Game [sfiction]

暴力求小数据可以得出对于s>=t,n>=m,当且仅当gcd(s,t)=1、2s<=n、s+t<=m、s+t为奇数时,能够走遍整个棋盘。给定n和m,后三个条件可以O(1)求出,因此可以对gcd容斥,借助反演和分段可以做到O(n0.5+m0.5)。注意n=m=1的特例。

F. Fibonacci of Fibonacci [JTJL]

找循环节。

G. Global Warming

TBA

H. Hash Collision [Sfiction, Akalm]

用类似快速幂的方法倍增求n下的方案数, ntt+crt 转移

用a[i]表示哈希值为i的字符串数,则n+1可以暴力在O(SIGMA*m)内完成,n*2则可以用卷积处理,结果的范围过大,需要使用ntt+crt,复杂度为O(mlogm+mlogLL)。总得复杂度为O(mlogn(SIGMA+logm+logLL))。

I. Increasing or Decreasing [sfiction]

确定最高最低值和长度的不严格单调序列数可以用组合数计算。因此用类似数位DP的方法逐位统计即可。O(10logn)。

J. Just Convolution [Akalm]

枚举最大的 100N 对a_i+b_j,再暴力处理c[]中没被更新过的位置