[51nod]算法马拉松18 总结

第一次打马拉松。。
a
一看题。。什么鬼。。
n=4竟然是无解,第一个点给了一个n=5的,好像是构造的挺有规律的样子。。
那就偶数无解,奇数照着他的构造方法写一发吧。。
怎么a了?不管了。。

既然结束了还是要回来好好想一下是什么情况的。
偶数肯定是无解的,因为一共有 n(n1)2 条边,那么每种颜色的边出现次数相等的话,就意味着每条边应该出现 n12 次,那么就要求 n1mod20 ,所以n只能是奇数。
那么我们不妨把节点和颜色编号改为[0,n),然后令(i,j)的颜色是i+j mod n.
这样对于任意一个三元环(i,j,k)( i<j<k ),它的边的颜色就是(i+j,j+k,i+k)。二者之间其实是可以一一映射的。如果边的颜色是(a,b,c),那么三元环就是( a+bc2,a+cb2,b+ca2 ),而既然n是奇数,那么2就是有逆元的。
b
一开始没有考虑清楚边界情况,以为直接从n=0开始dp,前面的都塞满0就可以了,但是这样的话n=2的时候10就会是一个非法状态。所以说要从n=2或3开始dp才行。
c
显然零点有一个 π 的周期,然后我猜它在 (0,π) 是单调的,二分了一个零点。
结果一直过不了样例,调了半天发现把一个double写成int了。。交上去发现a了。。

结束了之后来考虑一下这是什么情况。。
于是又学了一遍三角函数。。最后发现原来这么大的式子根本毫无卵用。

k=1w(Asin(x+k)k+sin(k)+Bcos(x+k)k+cos(k))=k=1w(Ak+sin(k)(cosksinx+sinkcosx)+Bk+cos(k)(coskcosxsinksinx))=asinx+bcosx=αsin(x+β)
也就是由辅助角公式的一个简单推论:sin(x)的线性和还是sin(x)。
d
显然答案的式子应该这么化: xsubtree(v),vson(u)(size(u)size(v))bit[depth[x]depth[u]]
我们单独考虑每一位 2k ,显然如果在 mod2k+1 意义下运算这一位是不会变的。如果这一位是1的话,就意味着 xa[2k,2k+1) 。那么就相当于是子树查询权值在一个范围里的数的个数。
可以dfs序+主席树,但是常数太大T了。。后来发现直接在dfs的时候+bit就很好写。。
时间复杂度 O(nlog22n)
e
对于每一个 g(i) ,枚举它的约数j, f(ij) 会被贡献h(j)次。
j=px11px22... ,则 h(j)=o(k+xo1k1) .
这样k虽然看起来很大,但是没啥用直接模 109+7 就行。
先筛出每个数的最小质因子,然后h,g都可以暴力求,时间复杂度 O(nlogn) .
f
考虑f(i,k)表示X部1~i个点匹配了k个,最大的Y部的节点是多少。
转移就是
f(i,k)=min{f(i1,k)li,f(i1,k1)<lif(i1,k1)+1,f(i1,k1)[li,ri)}

那么考虑同一个i,对于k来说f显然是单增的。因为假如有f(i,k)≤f(i,k-1),那么考虑在f(i,k)的最优方案中,前k-1条匹配边一定 < f(i,k),那么就意味着f(i,k-1) < f(i,k),就产生矛盾了。
也就是说其实f(i,k)的转移是如果 f(i1,k1)[li,ri) ,就一定有 f(i,k)=f(i1,k1)+1 ,因为 f(i1,k1)+1f(i1,k) ;否则如果 f(i1,k1)<li && f(i1,k)li ,就一定有 f(i,k)=li .
那么就相当于是区间+1,单点修改,把一个数移到从一个地方移到另一个地方。就用splay/fhq treap维护一下就可以了。
很久没写splay了。。结果找前驱/后继的时候忘了pushdown调了一个小时。。
时间复杂度 O(nlogn) ,结果跑了2s+…
总结:
①dp的时候一定要考虑好边界情况。
②一定要想清楚变量的类型int/long long/double.
③写代码的时候一定要考虑清楚。
④sin(x)的线性和还是sin(x).
⑤遍历树的时候一定要记得下传标记!

你可能感兴趣的:(DP,构造,BIT,平衡树,数学)