「考试」省选55
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]\)的节点个数的奇偶性。
然后我们建树的时候建出来\(x\in[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\),使得\(a\in t1,b\in t2\)。
我们考虑如何计算\(se(x,t1,t2)\)
后面的那个东西可以直接搞一个前缀和来做。
这样相当于是在枚举\(a,b\)在\(t1\),\(t2\)中的排名以及\(a\)在\(x\)中有多少个\(t2\)中的点比\(a\)靠前。
第二个枚举可以用前缀和优化掉。
然后我们考虑去统计以\(x\)为\(lca\)的逆序对贡献和。
那么有: