CF198 Div 1 题解

刚做完这场CF,现在在坐等FST……顺便来除草……


A:

题意:给定数轴上n个互不相同的点,定义距离为坐标差的绝对值。现在随机一个访问顺序,求从原点出发的期望行走距离。n<=100,000。

解:我们考虑每对点,他们对答案有贡献当且仅当他们在序列中相邻,而两个点相邻的概率为(n-2)!*(2+(n-2)*2)=2(n-1)!。我们只需要排个序然后扫一遍就能求出答案了。注意还有从0出发走到第一个点的距离需要计算。


B:

题意:给定长度为n的排列a,对这个排列进行升序冒泡排序。同时有一个n个点的图G,每个点对应排列中的一个数。对于每一对在冒泡排序中交换了的数,在G中连一条边。求G的最大独立集。n<=100,000。

解:冒泡排序中每个数会和它前面比它大的和后面比它小的交换位置,换句话说,G中两点i,j(i<j)不存在边当且仅当ai<aj。那么答案就是最长上升子序列。


C:

题意:给定长度为n的排列a,其中有一些位置上的数是-1。求有多少种不同的排列满足,将-1替换为一个数字之后使得任意的ai!=i。n<=2000。

解:我们用一个n*n的棋盘来表示能放的位置,第i行第j列表示数字i填在了第j个位置。从棋盘中删去不为-1的位置的列以及已经出现了的数字的行,记此时棋盘大小为N。不难发现,每行每列不可行的位置只有1个,记这种位置的数量为M。令f[N][M]表示方案数,有f[n][m]=f[n][m-1]-f[n-1][m-1],边界f[i][0]=i!。


D:

题意:在n*n的表格上完成m次操作:1、查询一个矩形区域内的xor和;2、将一个矩形区域内所有数xor上一个数。n<=1000,m<=100,000。

解:二维的xor和可以类似区间和地表示成4个区间的xor,我们把查询和修改都拆成4个。由于xor是自身的逆运算,如果一个查询区间内,某次修改的元素有奇数个,这次修改才对这次查询有贡献。我们把修改视为后缀矩形([x..n,y..n]),查询视为前缀矩形([1..x,1..y]),考虑怎么样的两个格子围成的矩形有奇数个元素。

首先对棋盘黑白染色后两个格子颜色应该相同,其次俩格子的横纵坐标应同奇偶。这样棋盘上共有4类格子,对于一个查询,只有同类格子上的修改才有贡献。那么维护4个二维树状数组就可以了。


E:

不会……




UPD:测完了……奇迹般地没有FST……还拿了个Rank 5……有史以来的最好成绩……估计下一场要回紫名了

你可能感兴趣的:(codeforces)