第一次打马拉松。。
a
一看题。。什么鬼。。
n=4竟然是无解,第一个点给了一个n=5的,好像是构造的挺有规律的样子。。
那就偶数无解,奇数照着他的构造方法写一发吧。。
怎么a了?不管了。。
既然结束了还是要回来好好想一下是什么情况的。
偶数肯定是无解的,因为一共有 n(n−1)2 条边,那么每种颜色的边出现次数相等的话,就意味着每条边应该出现 n−12 次,那么就要求 n−1mod2≡0 ,所以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+b−c2,a+c−b2,b+c−a2 ),而既然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)(coskcosx−sinksinx))=asinx+bcosx=αsin(x+β)
也就是由辅助角公式的一个简单推论:sin(x)的线性和还是sin(x)。
d
显然答案的式子应该这么化:
∑x∈subtree(v),v∈son(u)(size(u)−size(v))bit[depth[x]−depth[u]]
我们单独考虑每一位
2k ,显然如果在
mod2k+1 意义下运算这一位是不会变的。如果这一位是1的话,就意味着
x−a∈[2k,2k+1) 。那么就相当于是子树查询权值在一个范围里的数的个数。
可以dfs序+主席树,但是常数太大T了。。后来发现直接在dfs的时候+bit就很好写。。
时间复杂度
O(nlog22n)
e
对于每一个
g(i) ,枚举它的约数j,
f(ij) 会被贡献h(j)次。
若
j=px11px22... ,则
h(j)=∏o(k+xo−1k−1) .
这样k虽然看起来很大,但是没啥用直接模
109+7 就行。
先筛出每个数的最小质因子,然后h,g都可以暴力求,时间复杂度
O(nlogn) .
f
考虑f(i,k)表示X部1~i个点匹配了k个,最大的Y部的节点是多少。
转移就是
f(i,k)=min{f(i−1,k)li,f(i−1,k−1)<lif(i−1,k−1)+1,f(i−1,k−1)∈[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(i−1,k−1)∈[li,ri) ,就一定有
f(i,k)=f(i−1,k−1)+1 ,因为
f(i−1,k−1)+1≤f(i−1,k) ;否则如果
f(i−1,k−1)<li &&
f(i−1,k)≥li ,就一定有
f(i,k)=li .
那么就相当于是区间+1,单点修改,把一个数移到从一个地方移到另一个地方。就用splay/fhq treap维护一下就可以了。
很久没写splay了。。结果找前驱/后继的时候忘了pushdown调了一个小时。。
时间复杂度
O(nlogn) ,结果跑了2s+…
总结:
①dp的时候一定要考虑好边界情况。
②一定要想清楚变量的类型int/long long/double.
③写代码的时候一定要考虑清楚。
④sin(x)的线性和还是sin(x).
⑤遍历树的时候一定要记得下传标记!