51nod算法马拉松18总结

第一次打算法马拉松。
第一个晚上后就有人ak实在把我吓了一跳,后来十多个人ak了,几乎想要放弃的感觉。。。

A:
构造题,首先可以证明n为偶数时是无解的。
然后我在n为奇数的构造上花了点时间,后来观察n=5时的答案发现构造方法如下:
枚举i,然后给所有边(i,j)(i < j)按顺序染色。
首先i=1,那么连出去的边分别染为1,2,3…n-1
然后i=2,连出去的边染为3,4,5…n
i=3,染为5,6…1
……
i= n12+1 ,连出去2,3,4….
……
也就是把编号看成0——n-1,然后(i,j)染色为(i+j)%n

B:
一眼题!首先可以设f[i][j]表示前i位已经确定,最后3位用2进制状态j表示。
然后n很大,要用矩阵乘法。。

C:
我最后一道切的题。看完后:三角函数懵逼.jpg
后来换了几个a,b打了个表,发现f(x)是个周期性函数,并且相邻两个零点距离为 Π ,然后二分找出第一个正根,接着暴力找剩下的根。
后来取了下经,发现式子是这样化的:

F(x)=k=1w(Ak+sin(k))sin(x+k)+Bk+cos(k)cos(x+k)=k=1w(Ak+sin(k))(sin(x)cos(k)+cos(x)sin(k))+Bk+cos(k)(cos(x)cos(k)sin(x)sin(k))=asin(x)+bcos(x)=αsin(x+β)

D:
可以考虑对二进制每一位分别处理。
假设当前是处理二进制第k位。可以发现它的父亲中和它距离的二进制第k位为1的是几个长度相同的区间。那么对每个深度都对 2k+1 取模后就是深度相同的一段。
那么每递归向下一层就是相当于区间往后移动一位。就可以 O(n) 地计算了。

E:
感觉也差不多是一眼题。
看起来一大堆sigma,考虑f(i)对g(j)的贡献,其实就是通过k个sigma后到达i的方案数。然后每次i都是变成它的倍数,所以可以分解质因数分别考虑每个质因数。假设当前质因数次数为x,贡献就是 Cx1k+x1
但是k很大,不过我们发现只要预处理 log(n) 个这样的组合数即可。直接暴力!
总时间复杂度 O(nlogn)

F:
要好好利用边不相交这个条件。
可设f[i][j]表示前i个数匹配了j个后,最后一个匹配中B集的点的编号最小是多少。显然i相同时这是单调递增的。
然后考虑转移,对于当前的li,ri,找到f[i-1]中值在[li,ri)范围的数。这显然是一个区间。然后假设f[i-1][k]∈[li,ri),f[i-1][k]+1—>f[i][k+1]。对于满足条件的最小的k,f[i][k]=li。
n达到300000,用splay来维护即可。

你可能感兴趣的:(杂文,矩阵乘法)