Processing math: 0%

PKUSC2019题解

D1T1n个村庄,第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)

 



D1T22n个人在n张桌上打乒乓球,下一轮中,第i(1<i<n)张桌上的双方将分别为这一轮的第i-1张桌的胜者和第i+1张桌的负者。第1张桌上分别是第1,2张桌的负者,第n张桌上分别是第n-1,n张桌的胜者。当两人较量时,编号大的一方有2/3概率赢,1/3概率输,问第m+1i在第j张桌上打球的概率。n\leqslant 9,m\leqslant 20

一个自然的想法是,f_{i,j}表示ij打球的概率,但最主要的问题是概率不独立。于是需要将状态拆得相互独立,设f_{i,j,S}表示ij打球,其余位置的人状态为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_in\leqslant 5\times 10^4,m\leqslant 10^6,a_i\leqslant 2^{60}

将所有数二进制拆分后建出Trie,发现k的某一位为1就相当于将这一层的左右子树交换,于是这整体上就相当于一个背包,用bitset优化即可做到O(\frac{n^2}{\omega})

 



D2T1n个点的树染m种颜色,相邻点不能同色。K个限制形如第x_i个点不能染y_i色,求合法方案数。

f_{i,j}表示点ij色时子树方案数,观察转移方程可以发现合并子树就相当于两个数组作点积,安个父亲就相当于整体*-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)

posted @   HocRiser  阅读(776)  评论(1编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示