T1
好可恶的憨憨题。。
大体上是一个思路转化。
我们把求被覆盖的方案数转化为求总方案数和不被覆盖的方案数。
我们知道最多有(nlogn)个区间的(gcd)是不同的。
我们把这些极长区间求出来。
按照左端点找右端点和右端点找左端点分别求两次。
会得到一个三元组((L,r1,r2),(R,l1,l2))
然后我们枚举(gcd)以及其包含的三元组。
那么设(f[i])为右端点为([1,i])的合法方案数,(g[i])为([i,n])为左端点的合法方案数。
那么答案的(i)的位置的贡献上就要加上(f[i-1]g[i+1])表示不包含这个点的方案数。
考虑用线段树和三元组区间优化转移。
那么以(f)为例子。
有:
这样用线段树转移一下就可以了。
然后我们发现假设我们把端点(L,R)离散化,那么一段区间中的所有点的(f[i-1],g[i+1])全都是相同的,我们可以用一个差分来搞这个东西。
总方案数的算法就是直接把(f[n])累加起来就可以了。
最终用总方案数-贡献即可算出正确答案。
T2
博弈论结论题。
其实我们把一个点到根的某条树链抽开来分析的话。
他和翻硬币游戏挺像的。
翻硬币游戏是说
一行硬币,最终要求全部都翻到反面,每次可以选择一个正面为右端点,然后反转一段区间中的所有硬币。
这个翻硬币游戏是可以把正面的分开来考虑的。
这个题模型和翻硬币很相似,我们也可以抽离开每一个白色的点分别作为一个游戏考虑。
然后莫名其妙的打表发现(SG((i,j))=lowbit(max(i,j)))
由(SG)定理得到一个总的游戏的(SG)值为多个分游戏的(SG)的值。
就是要求所有矩形并中所有节点的(lowbit(max(i,j)))。
那么我们可以做扫描线。
枚举一下(i),然后分别求([i+1,mx])的(lowbit(j))的(xor)和。
以及([0,i])的节点个数的奇偶性。
然后我们建树的时候建出来(xin[l,r])这样一个节点。
这个节点如果全部被覆盖的话,那么其答案一定是(((r-l+1)/2)^lowbit(l))。
那么就可以扫描线硬来了。
T3
定义:
(g[x])为(x)及其子树的拓扑序个数。
(f[x][t][i])为(t)在(x)的子树拓扑序中的排名为倒数第(i)位的方案数。
(dp[x])为(x)及其子树的各种拓扑序形成的逆序对个数。
(fr(x,S))为(x)去掉(S)中的所有儿子的子树后的拓扑序个数。
(se(x,t1,t2))为(x)的(t1)儿子和(t2)儿子中的点形成的逆序对方案。
设某个点有(k)个儿子。
首先考虑(g)的(dp)。
有转移:
这样相当于是一个可重集合排列+内部定序。
然后又有:
设祖先关系必然存在的逆序对个数为(ct)。
那么祖孙关系得到的必然贡献就是:(ctg[1])。
然后考虑偶然贡献,也就是兄弟子树之间的贡献。
首先考虑(f)数组的转移。
设(c)为(x)的一个儿子,其中(t)是(c)子树中的某一个点。
设:(S=sz[x]-1-sz[c])。
那么有:
枚举两个儿子(t1,t2)。
考虑计算(se(x,t1,t2))
枚举两个点(a,b),使得(ain t1,bin t2)。
我们考虑如何计算(se(x,t1,t2))
后面的那个东西可以直接搞一个前缀和来做。
这样相当于是在枚举(a,b)在(t1),(t2)中的排名以及(a)在(x)中有多少个(t2)中的点比(a)靠前。
第二个枚举可以用前缀和优化掉。
然后我们考虑去统计以(x)为(lca)的逆序对贡献和。
那么有: