2016-E33-team1

从 Trac 迁移的文章

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

原文章内容如下:

||Time||Problem||Result||
||04:59:08||C||Wrong Answer !#2||
||04:56:48||C||Wrong Answer !#2||
||02:55:02||F||Accepted||
||01:39:21||G||Accepted||
||01:12:45||H||Accepted||
||01:09:31||H||Time Limit Exceeded !#10||

比赛链接: http://10.71.10.90/sfiction/ranklist/ICPCCamp2017/ICPCCamp2017-Day3.htm

start at 10:00

== 流水账 ==

== 总结 ==

== 题解 ==

=== A. Random Numbers [JTJL, sfiction] ===

首先在一个可能的范围内枚举m。

Sol1:解同余方程nk=Sa-Sb(mod m),有gcd(n,m)个解。然后枚举A中的数用map检查即可,如果不符会快速退出。

Sol2:计算A/B中两两差平方和Sa和Sb,(Sa-Sb)%m=0。可以判掉绝大多数非法的m。确定k可以对A/B取模并排序,然后取循环差分序列做kmp(A加倍)求解(或者最小表示法)。

=== C. Eulerian Orientation [sfiction] ===

设有R个基本环,共有2^R^种方案。x^2^之和即为同时出现在一个方案中的边对(u,v)总数。(u,u)共出现2^R-1^次。对于(u,v),设u所在环为A个,v所在环为B个,公共环为C个。若A>C&&B>C。则共2^C+A-C-1+B-C-1+rest^=2^n-2^。A>B=C时同样是2^n-2^。但当A=B=C时为2^n-1^。因此要特别处理所在环集合相同的边对数。这可以通过对边集合hash来完成。给每个环random一个seed,返祖边只在一个基本环上,其他边则DFS一遍计算,因为需要可逆性质,可以对seed求和或者异或和。注意R=0和R=1的情况。O(nlogn)。

=== D. Tube Master II [JTJL] ===

只有唯一解,可以递推。对于格点(x,y),根据其左侧和上方、(x,y+1)的上方三条边的状态,再加上(x,y)右下的格子的数字,可以唯一确定(x,y)下方和右侧的边的状态。外部边均不存在,不需要枚举边界。O(nm)。

=== F. Median on Binary Tree [JTJL, sfiction] ===

在一个有序序列中,将不小于x的数标为1,小于x的数标为-1,则序列和s>=1则表示中位数>=x。因此在树上按此标号之后,有和>=1的子树即表示有解。加入a的偏移之后,相当于增加头部的-1,因此限制为s>=a+1。树上最大和连通块只需树形DP求每个点为根的最大子树(可能不是极大子树)即可。于是只要将树上所有点设为-1。初始中位数为n,从小到大枚举a,当不存在满足要求的子树时则将中位数-1并更新子树,由于深度只有logn,暴力沿上升路径更新即可。O(nlogn)。

=== G. Card Shuffling [JTJL, sficiton] ===

首先发现[1,2,...,k-1,k,x,...]可以快速模拟(????)。而对于1位于位置x的情况,可以发现消耗步数f(x)<=f(x-1)+f(x-2)。

=== H. Independent Events [JTJL, Akalm] ===

ln(1-x)泰勒展开前数项,用线段树维护。O(n+qlogn)。

=== I. Territory Game [sfiction] ===

分类讨论。若k<2d,则双方无法互达,答案为0。若k=2t,如果相对走,并且k为奇数,A会因为先手会损失一个点,结果为-1。如果,A不能进入B的可达范围,因此断开一条边,如果A出发的最长链>=t,则可以使结果为0。若k=2t+1,则B会面临类似情况,也断开边求从B最长链。某点出发最长链必定结束于直径其中一端。可以用树形DP求出断开任意边两侧子树的直径。DP为O(n),距离计算和断边位置需要LCA。O(nlogn)。

树形DP可以down+up,叉姐的方法只需要down。首先求出整棵树的直径,然后以两个端点为根分别down。如果断在直径上,则两侧子树会分别计算其一侧。如果不断在直径上,则一侧会被计算两次,另一侧则显然保留原直径。
TimeProblemResult
04:59:08CWrong Answer !#2
04:56:48CWrong Answer !#2
02:55:02FAccepted
01:39:21GAccepted
01:12:45HAccepted
01:09:31HTime Limit Exceeded !#10

比赛链接: http://10.71.10.90/sfiction/ranklist/ICPCCamp2017/ICPCCamp2017-Day3.htm

start at 10:00

流水账

总结

题解

A. Random Numbers [JTJL, sfiction]

首先在一个可能的范围内枚举m。

Sol1:解同余方程nk=Sa-Sb(mod m),有gcd(n,m)个解。然后枚举A中的数用map检查即可,如果不符会快速退出。

Sol2:计算A/B中两两差平方和Sa和Sb,(Sa-Sb)%m=0。可以判掉绝大多数非法的m。确定k可以对A/B取模并排序,然后取循环差分序列做kmp(A加倍)求解(或者最小表示法)。

C. Eulerian Orientation [sfiction]

设有R个基本环,共有2R种方案。x2之和即为同时出现在一个方案中的边对(u,v)总数。(u,u)共出现2R-1次。对于(u,v),设u所在环为A个,v所在环为B个,公共环为C个。若A>C&&B>C。则共2C+A-C-1+B-C-1+rest=2n-2。A>B=C时同样是2n-2。但当A=B=C时为2n-1。因此要特别处理所在环集合相同的边对数。这可以通过对边集合hash来完成。给每个环random一个seed,返祖边只在一个基本环上,其他边则DFS一遍计算,因为需要可逆性质,可以对seed求和或者异或和。注意R=0和R=1的情况。O(nlogn)。

D. Tube Master II [JTJL]

只有唯一解,可以递推。对于格点(x,y),根据其左侧和上方、(x,y+1)的上方三条边的状态,再加上(x,y)右下的格子的数字,可以唯一确定(x,y)下方和右侧的边的状态。外部边均不存在,不需要枚举边界。O(nm)。

F. Median on Binary Tree [JTJL, sfiction]

在一个有序序列中,将不小于x的数标为1,小于x的数标为-1,则序列和s>=1则表示中位数>=x。因此在树上按此标号之后,有和>=1的子树即表示有解。加入a的偏移之后,相当于增加头部的-1,因此限制为s>=a+1。树上最大和连通块只需树形DP求每个点为根的最大子树(可能不是极大子树)即可。于是只要将树上所有点设为-1。初始中位数为n,从小到大枚举a,当不存在满足要求的子树时则将中位数-1并更新子树,由于深度只有logn,暴力沿上升路径更新即可。O(nlogn)。

G. Card Shuffling [JTJL, sficiton]

首先发现[1,2,...,k-1,k,x,...]可以快速模拟(????)。而对于1位于位置x的情况,可以发现消耗步数f(x)<=f(x-1)+f(x-2)。

H. Independent Events [JTJL, Akalm]

ln(1-x)泰勒展开前数项,用线段树维护。O(n+qlogn)。

I. Territory Game [sfiction]

分类讨论。若k<2d,则双方无法互达,答案为0。若k=2t,如果相对走,并且k为奇数,A会因为先手会损失一个点,结果为-1。如果,A不能进入B的可达范围,因此断开一条边,如果A出发的最长链>=t,则可以使结果为0。若k=2t+1,则B会面临类似情况,也断开边求从B最长链。某点出发最长链必定结束于直径其中一端。可以用树形DP求出断开任意边两侧子树的直径。DP为O(n),距离计算和断边位置需要LCA。O(nlogn)。

树形DP可以down+up,叉姐的方法只需要down。首先求出整棵树的直径,然后以两个端点为根分别down。如果断在直径上,则两侧子树会分别计算其一侧。如果不断在直径上,则一侧会被计算两次,另一侧则显然保留原直径。