「考试」省选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\)为例子。
有:

\[\forall i\in[R,n],f[i]+=\sum\limits_{j=l1}^{l2}f[j-1] \]

这样用线段树转移一下就可以了。
然后我们发现假设我们把端点\(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\)
有转移:

\[g[x]=sz[x]!\prod\limits_{i=1}^{k}\frac{g[ch[x][i]]}{(sz[ch[x][i]])!} \]

这样相当于是一个可重集合排列+内部定序。
然后又有:

\[fr(x,S)=\left(\sum\limits_{i=1}^{k}[ch[x][i]\not\in S]sz[ch[x][i]]\right)!\prod\limits_{i=1}^{k}\frac{g[ch[x][i]]}{sz[ch[x][i]]!} \]

设祖先关系必然存在的逆序对个数为\(ct\)
那么祖孙关系得到的必然贡献就是:\(ctg[1]\)
然后考虑偶然贡献,也就是兄弟子树之间的贡献。
首先考虑\(f\)数组的转移。
\(c\)\(x\)的一个儿子,其中\(t\)\(c\)子树中的某一个点。
设:\(S=sz[x]-1-sz[c]\)
那么有:

\[f[x][t][i]=fr(x,c)\sum\limits_{j=0}^{min(sz[t],i)}f[c][t][j]\binom{i-1}{j-1}\binom{sz[c]+S-i}{sz[c]-j} \]

枚举两个儿子\(t1,t2\)
考虑计算\(se(x,t1,t2)\)
枚举两个点\(a,b\),使得\(a\in t1,b\in t2\)
我们考虑如何计算\(se(x,t1,t2)\)

\[se(x,t1,t2)=\sum\limits_{a\in T1}\sum\limits_{b\in T2}[a<b]\sum\limits_{i=1}^{sz[t1]+sz[t2]}\sum\limits_{j=1}^{sz[t1]}f[t1][a][j]\binom{i-1}{j-1}\binom{sz[t1]-j+sz[t2]-(i-j)}{sz[t1]-j}\sum\limits_{k=1}^{i-j}f[t2][b][k] \]

后面的那个东西可以直接搞一个前缀和来做。
这样相当于是在枚举\(a,b\)\(t1\),\(t2\)中的排名以及\(a\)\(x\)中有多少个\(t2\)中的点比\(a\)靠前。
第二个枚举可以用前缀和优化掉。
然后我们考虑去统计以\(x\)\(lca\)的逆序对贡献和。

\[dp[x]=\sum\limits_{i=1}^{k}\sum\limits_{j=1}^{k}fr(x,ch[x][i],ch[x][j])se(x,ch[x][i],ch[x][j])\binom{sz[x]-1}{sz[ch[x][i]]+sz[ch[x][j]]}+\sum\limits_{i=1}^{k}dp[ch[x][i]]fr(ch[x][i])\binom{sz[x]-1}{sz[ch[x][i]]} \]

那么有:

\[ans=g[1]ct+dp[1] \]

posted @ 2020-03-26 18:13  Lrefrain  阅读(170)  评论(0编辑  收藏  举报