省选模拟55
A. 调兵遣将
直接做不好做,因为要枚举区间复杂度就已经炸了,所以考虑用总方案数减去不包含当前位置的方案数。
由于整个序列的gcd种类数只有$nlogw$种,所以可以考虑对于每一种gcd分别考虑。
对于每一种$gcd=w$,用$(x,l,r)$表示$[l....r,x]$这样的区间满足$gcd=w$,然后考虑dp,令$f_i$表示前i个位置满足条件的方案数。
那么转移实际上就是区间求和和区间加,直接用线段树可以简单维护。
于是这样就可以求出来总方案数。
同理用$g_i$表示$i$到$n$的合法方案数,转移类似。
然后就可以用$f$和$g$表示不包含当前位置的方案数,发现方案数不同的区间实际上只有不同的区间端点种,所以对于每个区间统一考虑即可。
B. 一掷千金
发现这是个经典的翻硬币模型,所以可以对于每个白点分别求出SG值然后异或起来。
对于每个白点(x,y),打表可以发现SG值是$lowbit(max(x,y))$,所以现在的问题是对于若干矩形的交求出所有这个东西的异或值。
然后可以想到线段树扫描线,那么剩下的问题就是直接计算一段区间$lowbit$的异或值。
考虑把线段树的节点长度开成2^k,那么这样的区间的值是容易算的,实际上两两抵消掉了,只剩下区间中点和左端点。
所以直接上线段树扫描线就没了。
C. 树拓扑序
考虑$dp[i][j][k]$表示$i$的子树中$j$的排名为$k$的方案数。
有了这个东西就可以暴力枚举子树中的点对和排名来统计贡献,预处理一下前缀和可以做到每对点$O(n)$求出。
然后考虑这个东西的转移,实际上还是枚举一个排名,再枚举前面出现了几个点,类似的转移即可。