PKUSC2019题解
$D1T1$:$n$个村庄,第$i$个村庄的人要去第$p_i$个村庄(保证$p_i$为排列),每次可以将相邻两个村庄的人位置交换直到所有人都到达目的地。再给定一个长为$n-1$的排列$a$,表示第$i$次在第$i$个和第$i+1$个村庄中间增设一个关卡,当一次交换发生时,若交换中间存在一个卡,或交换双方中至少有一方经过过一个卡,则需要支付$1$的路费。对每个$i$输出只考虑$a_{1}\sim a_i$的卡时需要支付的最少路费。$n\leqslant 3\times 10^5$。
结论:总代价=跨过某个卡的逆序对数。
证明:任意一对跨过某个卡的逆序对想要发生位置调换,必定会支付至少$1$的代价,故总代价<=跨过某个卡的逆序对数。将每两个卡之间的部分从小到大排序,那么可以构造出方案使得两个在不同块的逆序对才会发生交换且交换代价不会超过$1$,故总代价>=跨过某个卡的逆序对数。
于是问题变为每次增加一个卡并计算这个卡左右两边形成的逆序对数(即这个卡的贡献),可以倒着做然后线段树合并,也可以直接建主席树然后正着启发式合并。$O(n\log n)$或$O(n\log^2 n)$。
$D1T2$:$2n$个人在$n$张桌上打乒乓球,下一轮中,第$i(1<i<n)$张桌上的双方将分别为这一轮的第$i-1$张桌的胜者和第$i+1$张桌的负者。第$1$张桌上分别是第$1,2$张桌的负者,第$n$张桌上分别是第$n-1,n$张桌的胜者。当两人较量时,编号大的一方有$2/3$概率赢,$1/3$概率输,问第$m+1$轮$i$在第$j$张桌上打球的概率。$n\leqslant 9,m\leqslant 20$。
一个自然的想法是,$f_{i,j}$表示$i$在$j$打球的概率,但最主要的问题是概率不独立。于是需要将状态拆得相互独立,设$f_{i,j,S}$表示$i$在$j$打球,其余位置的人状态为$S$的方案数。$S$是个$n$位三进制数,$0/1/2$分别代表某张桌上两个人都比$i$弱/都比$i$强/一强一弱,转移显然,$O(3^n2^nn^2m)$。
注意到其实只需要关心当一张桌上两个人一强一弱时的结果,所以可以优化到$O(4^nnm)$。标算使用轮廓线做到了$O(3^nn^2m)$。
$D1T3$:给定数组$\{a_n\}$以及$m$个询问$(x_i,y_i)$,每次询问是否存在一个$k$使得$a_{x_i}$异或$k$在所有数异或$k$中排第$y_i$。$n\leqslant 5\times 10^4,m\leqslant 10^6,a_i\leqslant 2^{60}$。
将所有数二进制拆分后建出$Trie$,发现$k$的某一位为$1$就相当于将这一层的左右子树交换,于是这整体上就相当于一个背包,用$bitset$优化即可做到$O(\frac{n^2}{\omega})$。
$D2T1$:$n$个点的树染$m$种颜色,相邻点不能同色。$K$个限制形如第$x_i$个点不能染$y_i$色,求合法方案数。
$f_{i,j}$表示点$i$染$j$色时子树方案数,观察转移方程可以发现合并子树就相当于两个数组作点积,安个父亲就相当于整体*-1后加上某个值。这都可以用双标记(乘法和加法)线段树合并或$Splay$启发式合并来完成。没有被询问涉及到的颜色贡献必然相等于是只要开一个点就可以了。$O(n\log n)$或$O(n\log^2 n)$。
$D2T2$:给定一棵$n$个点的无边权树,在$m$为空间中找一棵同样的树,满足任意两点的曼哈顿距离等于它们在原树上的距离,最小化$m$并输出方案。$n\leqslant 100$。
将根设为$(0,...,0)$,$A_i$表示$i$与父亲的差向量,显然$|\Sigma A_{i,j}|=1$。
结论:$A_i$一定是形如$(0,...,1,...,0)$或$(0,...,-1,...,0)$的形式。若两个点是祖孙关系那么若存在$i$使得$A_{u,i}$和$A_{v,i}$均非$0$,则它们必定同号。若两点不是祖孙关系,则它们必定不同号。
问题变为用$m$条链覆盖这棵树,链的$LCA$一侧都是$1$另一侧都是$-1$,当一个点被多条链覆盖时任选一个,做一个带线头的$DP$即可。$O(n^2)$。
$D2T3$:一棵$n$个点的树任意加新边(不能有重边和自环),使这张图的线图是弦图,求合法方案数。$n\leqslant 2\times 10^5$。
线图:为每条边建一个点,若两条边有公共点则两个点之间连一条边。
弦图:不存在一个$4$元或以上的简单环使得环中任意两个点不再有边。
观察发现一个图的线图是弦图,当且仅当它不存在一个$4$元或以上的简单环。问题变为将树上的点分集合,要么一条边独立成集合,要么两条相邻的边成一个集合,求方案数。$f_{i,0/1}$表示$i$的子树分配集合,且$i$到父亲的边是否已经被分进集合的方案数。转移时要考虑有多少个点第二维取$0$。
考虑加速,先预处理出$g_{i,0/1}$表示$i$个点自由分集合,父亲边是否被分入集合的方案数。然后考虑统计出有$i$个点$f$第二维取$0$的方案数,发现就是$\prod (f_{son,0}\ x+f_{son,1})$,分治$FFT$即可。$O(n\log^2 n)$。