第一次打算法马拉松。
第一个晚上后就有人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=
n−12+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)是个周期性函数,并且相邻两个零点距离为
Π
,然后二分找出第一个正根,接着暴力找剩下的根。
后来取了下经,发现式子是这样化的:
D:
可以考虑对二进制每一位分别处理。
假设当前是处理二进制第k位。可以发现它的父亲中和它距离的二进制第k位为1的是几个长度相同的区间。那么对每个深度都对
2k+1
取模后就是深度相同的一段。
那么每递归向下一层就是相当于区间往后移动一位。就可以
O(n)
地计算了。
E:
感觉也差不多是一眼题。
看起来一大堆sigma,考虑f(i)对g(j)的贡献,其实就是通过k个sigma后到达i的方案数。然后每次i都是变成它的倍数,所以可以分解质因数分别考虑每个质因数。假设当前质因数次数为x,贡献就是
Cx−1k+x−1
。
但是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来维护即可。