2016-E28-team1

从 Trac 迁移的文章

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

原文章内容如下:

||Run ID||Time||Size||Problem||Language||Result||Failed test||
||498||4:50:12||2421||I||g++0x||OK||N/A||
||497||4:36:09||2167||I||g++0x||Wrong answer||15||
||496||4:22:08||1597||I||g++0x||Wrong answer||8||
||495||4:09:09||1544||I||g++0x||Time-limit exceeded||8||
||494||4:03:44||2148||I||g++0x||Time-limit exceeded||8||
||493||3:52:28||1534||I||g++0x||Wrong answer||3||
||492||3:44:12||3071||J||g++0x||OK||N/A||
||491||3:13:31||915||A||g++0x||OK||N/A||
||490||3:06:20||910||A||g++0x||Time-limit exceeded||6||
||489||2:21:47||385||B||g++0x||OK||N/A||
||488||1:54:33||839||E||g++0x||OK||N/A||
||487||1:51:02||839||E||g++0x||Wrong answer||16||
||486||1:47:34||837||E||g++0x||Run-time error||10||
||485||1:43:44||5356||J||javac||Time-limit exceeded||9||
||484||1:12:05||1368||F||g++0x||OK||N/A||
||483||0:59:47||1231||F||g++0x||Time-limit exceeded||11||
||482||0:56:10||1447||C||g++0x||OK||N/A||
||481||0:34:09||1338||F||g++0x||Wrong answer||4||
||480||0:33:04||899||G||g++0x||OK||N/A||

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

start at 14:35

== 流水账 ==

=== sfiction ===

这场写了 CEBA。C 是个细节题,不应该在一开始抢机时,写了 30+min 也有点久,还是要提升一下细节题的速度。E 写得比较快但写错数组大小和一处判断条件 WA 了两次。B 代码很短,比较顺利。A 虽然写得巧妙但还是比较慢,而且又写挂了一个地方。

== 总结 ==

== 题解 ==

=== A. Morse Code [JTJL, sfiction] ===

考虑将单个询问划分为log段。注意到M可以通过复制自身并取反来构造,对于任意t,M序列的[t*2^k^,(t+1)*2^k^)都是和[0,2^k^)相同或者是取反的结果(取反与否只需快速检查A_{t*2^k^})。可以将询问划分为符合这一性质的段。段的大小在划分过程前半部分受到y的最低非0位的限制,在后半部分则受到k的大小的限制。使用倍增方法在O(nlogn)时间内预处理出f(i,j)=\sum_{k=0}!^{2^k^-1}(A_{i+k}*M_{k})。O(nlogn+qlogn)。

=== B. Deadly Sin [sfiction] ===

显然应该利用sin的周期性,可以令大周期为小周期的偶数倍,这样两者就可以独立调整。因此取xi=(2k)^i^,这样第i个不等式就依赖于a*(2k)^i^%2和1的大小关系。注意a应该加一个极小量以避免不等式左边为0。取k=5可以方便实现。O(n^2^+nq)。

=== C. Supermutations [sfiction] ===

按照下标模5分为5个序列,维护每个序列各自的段偏移量和段内位置,询问也拆分为5个。O(q)。

=== D. Serpentine [JTJL] ===

自然的考虑到可以分治。对于一个正方形,只要把九个小正方形的答案相加乘上(1/3)^p^即可。(Sierpinski地毯的边缘为白色,所以小正方形之间不会相互影响)。同时注意到a和b表示的斜率在整个过程中一直保持不变,c的变换也是在[1,a+b-1]之间的整数。所以我们倒着迭代若干次即可。

=== E. Best Student [wxj, sfiction] ===

首先只需考虑<=A_1的人。其次如果有和A_1完全一样的人则必然无解。根据每个分量<=或<可以得到2^n^条规则,这些规则将所有人划分为2^n^类。显然全部为=的规则必须为10,其他规则按照<的数量依次计算出应赋值即可。O(mn+n^2^)。

=== F. Snyrk’s Prediction [JTJL] ===

题意是给定两个排列,问是否存在一个逆序对同时出现在两个排列中(感觉日本人出过这个题)。考虑i本身、i在两个排列中的位置三个量,则可以得到三维空间中的n个点,问题转化为求是否存在一个点对,在三维上都满足<关系。考虑一维排序当作时间,剩下两维维护平面上的一条凸链。对于新的点判断是否和后一个点合法,同时动态更新另一侧的凸链即可。每个点只会出入数据结构一次,额外再做两次比较。用set来维护可以做到O(nlogn)。


=== G. Accordion [Akalm] ===
N奇和N偶K奇都是必胜态,N偶K偶时先手也只能选偶数个,所以策略是和N/2, K/2时是一样的

=== I. Polynomials [JTJL] ===

暴力Hash即可。(开场挂了一片以为卡Hash,结果好像都是T了)。
需要long long范围的(膜)数,同时需要注意自乘和0多项式的情况。

=== J. Foreign Currency Exchange [JTJL, Akalm] ===
hash维护一下分子分母,并对它们分别开一个数组来动态记录质因子次数来处理约分
Run IDTimeSizeProblemLanguageResultFailed test
4984:50:122421Ig++0xOKN/A
4974:36:092167Ig++0xWrong answer15
4964:22:081597Ig++0xWrong answer8
4954:09:091544Ig++0xTime-limit exceeded8
4944:03:442148Ig++0xTime-limit exceeded8
4933:52:281534Ig++0xWrong answer3
4923:44:123071Jg++0xOKN/A
4913:13:31915Ag++0xOKN/A
4903:06:20910Ag++0xTime-limit exceeded6
4892:21:47385Bg++0xOKN/A
4881:54:33839Eg++0xOKN/A
4871:51:02839Eg++0xWrong answer16
4861:47:34837Eg++0xRun-time error10
4851:43:445356JjavacTime-limit exceeded9
4841:12:051368Fg++0xOKN/A
4830:59:471231Fg++0xTime-limit exceeded11
4820:56:101447Cg++0xOKN/A
4810:34:091338Fg++0xWrong answer4
4800:33:04899Gg++0xOKN/A

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

start at 14:35

流水账

sfiction

这场写了 CEBA。C 是个细节题,不应该在一开始抢机时,写了 30+min 也有点久,还是要提升一下细节题的速度。E 写得比较快但写错数组大小和一处判断条件 WA 了两次。B 代码很短,比较顺利。A 虽然写得巧妙但还是比较慢,而且又写挂了一个地方。

总结

题解

A. Morse Code [JTJL, sfiction]

考虑将单个询问划分为log段。注意到M可以通过复制自身并取反来构造,对于任意t,M序列的[t*2k,(t+1)*2k)都是和[0,2k)相同或者是取反的结果(取反与否只需快速检查A_{t*2k})。可以将询问划分为符合这一性质的段。段的大小在划分过程前半部分受到y的最低非0位的限制,在后半部分则受到k的大小的限制。使用倍增方法在O(nlogn)时间内预处理出f(i,j)=\sum_{k=0}!{2k^-1}(A_{i+k}*M_{k})。O(nlogn+qlogn)。

B. Deadly Sin [sfiction]

显然应该利用sin的周期性,可以令大周期为小周期的偶数倍,这样两者就可以独立调整。因此取xi=(2k)i,这样第i个不等式就依赖于a*(2k)i%2和1的大小关系。注意a应该加一个极小量以避免不等式左边为0。取k=5可以方便实现。O(n2+nq)。

C. Supermutations [sfiction]

按照下标模5分为5个序列,维护每个序列各自的段偏移量和段内位置,询问也拆分为5个。O(q)。

D. Serpentine [JTJL]

自然的考虑到可以分治。对于一个正方形,只要把九个小正方形的答案相加乘上(1/3)p即可。(Sierpinski地毯的边缘为白色,所以小正方形之间不会相互影响)。同时注意到a和b表示的斜率在整个过程中一直保持不变,c的变换也是在[1,a+b-1]之间的整数。所以我们倒着迭代若干次即可。

E. Best Student [wxj, sfiction]

首先只需考虑<=A_1的人。其次如果有和A_1完全一样的人则必然无解。根据每个分量<=或<可以得到2n条规则,这些规则将所有人划分为2n类。显然全部为=的规则必须为10,其他规则按照<的数量依次计算出应赋值即可。O(mn+n2)。

F. Snyrk’s Prediction [JTJL]

题意是给定两个排列,问是否存在一个逆序对同时出现在两个排列中(感觉日本人出过这个题)。考虑i本身、i在两个排列中的位置三个量,则可以得到三维空间中的n个点,问题转化为求是否存在一个点对,在三维上都满足<关系。考虑一维排序当作时间,剩下两维维护平面上的一条凸链。对于新的点判断是否和后一个点合法,同时动态更新另一侧的凸链即可。每个点只会出入数据结构一次,额外再做两次比较。用set来维护可以做到O(nlogn)。

G. Accordion [Akalm]

N奇和N偶K奇都是必胜态,N偶K偶时先手也只能选偶数个,所以策略是和N/2, K/2时是一样的

I. Polynomials [JTJL]

暴力Hash即可。(开场挂了一片以为卡Hash,结果好像都是T了)。

需要long long范围的(膜)数,同时需要注意自乘和0多项式的情况。

J. Foreign Currency Exchange [JTJL, Akalm]

hash维护一下分子分母,并对它们分别开一个数组来动态记录质因子次数来处理约分