Atcoder Grand Contest 039 B,C,D,E,F

我的提交记录


B - Graph Partition

当图中存在奇环的时候显然无解(可以考虑x,yx,y之间存在边意味着xxyy所属的点集的下标奇偶性不同),否则一定有解。

如果存在划分成kk个集合的方案,那么图中必定存在两个点,它们之间的最短路径的边数是k1k-1。设dis(x,y)dis(x,y)表示x,yx,y之间的最短路的边数,1+maxx,y{dis(x,y)}1+\max_{x,y}\{dis(x,y)\}显然是答案的一个上界。

而这个上界是可以达到的。假设dis(x,y)dis(x,y)最大,我们把到xx的最短路长度等于ll的点分入集合Vl+1V_{l+1},就可以得到合法的方案。


C - Division by Two with Something

题目中的操作相当于删去二进制最低位,然后把删去的位取反放在最高位之前。

对于任意的一个数XX,它在2N2N次操作之后都必然会变成它本身。所以,倘若XXdd次操作之后变成了它本身,那么XXgcd(d,2N)\gcd(d,2N)次操作后一定也变回了它本身。所以,XX的最小操作次数一定是2N2N的约数。

观察发现,对于某一个d2Nd\mid 2N,如果XXdd次操作之后变回了本身,那么XX一定由2Nd\frac{2N}{d}段组成,2Nd\frac{2N}{d}是奇数,且XX有如下的形式:AAAAAAA'AA'\cdots A,其中AA是一个长度为d2d\over 20101串,AA'表示AA把每一位取反之后得到的结果。

枚举所有的满足dNd\mid NNdN\over d是奇数的dd,然后计算2d2d次操作之后变回本身的数的个数(不要求dd是最小操作次数),再通过容斥原理就可以算出2d2d为最小操作次数的数的个数。

如何判断一个AAAAAAA'AA'\cdots A是否小于等于题目给出的XX?先比较前A|A|位,如果不相同就可以确定A,XA,X的大小关系;否则,由于和XX的前A|A|位都相同的AA只有一个,可以暴力O(X)O(|X|)判断。拓展到对AAAAAAA'AA'\cdots A的计数就是:枚举AAXX不同的最高位是哪一位,之后的位可以随意取,并特殊判断XX的前A|A|位和AA完全相同的情况。


D - Incenters

对于某一个ABC\triangle_{ABC},我们作出AB,BC,CA\overset{\Large\frown}{AB},\overset{\Large\frown}{BC},\overset{\Large\frown}{CA}的中点C,A,BC',A',B'。则有ABC\triangle_{ABC}的内心与ABC\triangle_{A'B'C'}的垂心重合。

证明:

Atcoder Grand Contest 039 B,C,D,E,F

显然AA,CC,BBAA',CC',BB'ABC\triangle_{ABC}的内角平分线,所以γ=12ABC,α=12BCA,β=σ=12BAC\gamma={1\over 2}\angle ABC,\alpha = {1\over 2}\angle BCA, \beta=\sigma ={1\over 2}\angle BAC

ε=β+γ+α=12(ABC+BCA+CAB)=90\varepsilon = \beta + \gamma + \alpha = {1\over 2}(\angle ABC + \angle BCA +\angle CAB) = 90^\circ,所以BBCABB'\bot C'A'

同理可证明CCAB,AACBCC'\perp A'B',AA'\perp C'B'。所以AA,BB,CCAA',BB',CC'的交点为ABC\triangle_{A'B'C'}的垂心。

所以只需要算出ABC\triangle_{A'B'C'}的垂心的期望即可。

ABC\triangle_{A'B'C'}的外心为OO,重心为GG,垂心为HH,根据欧拉线我们有G=2O+H3G = {2O+H\over 3}(将点看做向量进行的加减乘除),也就是H=3G2OH = 3G - 2O。由于O=(0,0),G=A+B+C3O=(0,0),G={A'+B'+C'\over 3},只要考虑每一个AA'的贡献就可以得到答案。

时间复杂度O(n2)O(n^2)


E - Pairing Points

一个写得很好的博客

首先枚举与11配对的点,然后把11所在的线段删掉(图中虚线标出的),然后考虑那些与11所在的线段有交的线段(图中粗的黑线),发现剩下的的点一定恰好只与这些线段中的一条连通,并且与每一条线段连通的点集一定是两个连续的区间的并。

Atcoder Grand Contest 039 B,C,D,E,F

g[a][b][c][d]g[a][b][c][d]表示把[a,b][c,d][a,b]\cup[c,d]中的点连成一个连通块,并且要求有且仅有一条边的两端在两个区间内。为了辅助转移,再设f[a][b][c][d]=ax<b,c<ydg[a][x][y][d]f[x+1][b][c][y1]f[a][b][c][d] = \sum_{a\le x<b,c<y\le d}g[a][x][y][d]\cdot f[x+1][b][c][y-1],表示[a,b][c,d][a,b]\cup [c,d]为若干个合法的连通块“首尾”相邻拼起来的方案数。

考虑gg的转移(如下图):我们枚举跨越两个区间的边(x,y)(x,y),则[a,x1][x+1,b][a,x-1]\cup [x+1,b][c,y1][y+1,d][c,y-1]\cup [y+1,d]成为了两个互相独立的子问题,并且要求[a,x1][x+1,b][a,x-1]\cup [x+1,b]划分成若干个合法的连通块,[c,y1][y+1,d][c,y-1]\cup [y+1,d]划分成若干个合法的连通块:这就是f[a][b][c][d]f[a][b][c][d]的定义。所以我们得到

g[a][b][c][d]=axb,cydf[a][x1][x+1][b]f[c][y1][y+1][d] g[a][b][c][d]=\sum_{a\le x\le b,c\le y\le d} f[a][x-1][x+1][b] \cdot f[c][y-1][y+1][d]

Atcoder Grand Contest 039 B,C,D,E,F

最后的答案就是if[2][i1][i+1][2n]\sum_i f[2][i-1][i+1][2n]

时间复杂度O(n6)O(n^6)


F - Min Product Sum

考虑题目中给出的权值的组合意义:相当于对于一个确定的矩阵AA和一个还没有确定的矩阵BBAA的权值等于有多少种往BB中填数的方案,使得Bi,jB_{i,j}不大于AA中与它在同行或者同列的任何一个数。

而这个填数的条件等价于:对于每一行,BB的最大值小于等于AA的最小值;对于每一列,BB的最大值小于等于AA的最小值。

枚举每一列AA的最小值YiY_i,并要求这一列的BB的所有元素都不超过它;枚举每一行BB的最大值XiX_i,并要求这一行的AA的元素都不小于它。这与前面的条件仍然是等价的。

对于某一个格子Ai,jA_{i,j},如果Xi>YjX_i>Y_j,就在枚举XiX_i的时候考虑它的贡献;如果Xi<YjX_i<Y_j,就在枚举YjY_j的时候考虑它的贡献;如果Xi=YjX_i=Y_j,我们规定在枚举YjY_j的时候考虑它的贡献。对于某一个格子Bi,jB_{i,j},如果XiYjX_i\le Y_j,就在枚举XiX_i的时候考虑它的贡献,否则就在枚举YjY_j的时候考虑它的贡献。

我们先将行按照XiX_i排序,列按照YiY_i排序。枚举每一个XiX_i的时候,需要考虑贡献的格子就会有如下的形式(并且右侧的格子每一行要求至少有一个元素取到最大值):

Atcoder Grand Contest 039 B,C,D,E,F

枚举每一个YiY_i的时候,需要考虑的格子有如下的形式(左侧的格子每一列要求至少有一个元素取到最小值):

Atcoder Grand Contest 039 B,C,D,E,F

发现:

  • 枚举每一个XiX_i的时候,需要考虑的格子的总数量是mm;枚举每一个YiY_i的时候,需要考虑的格子的总数量是nn
  • 枚举每一个XiX_i的时候,AA中需要考虑的格子的数量等于YjY_j中满足Yj<XiY_j < X_ijj的数量;枚举每一个YiY_i的时候,AA中需要考虑的数量等于满足XjYiX_j\le Y_ijj的数量。

f[t][i][j][0]f[t][i][j][0]表示X1,X2,XiX_1,X_2,\cdots X_iY1,Y2YjY_1,Y_2\cdots Y_j已经确定,且Xi<t,Yj<tX_i< t, Y_j< t的方案数;f[t][i][j][1]f[t][i][j][1]表示X1,X2,XiX_1,X_2,\cdots X_iY1,Y2YjY_1,Y_2\cdots Y_j已经确定,且Xit,Yj<tX_i\le t, Y_j < t的方案数。对f[t][i][j][0]f[t][i][j][0],枚举Xi=tX_i=t的行数进行转移;对f[t][i][j][1]f[t][i][j][1],枚举Yj=tY_j=t的列数进行转移。

总时间复杂度O(nmk(n+m))O(nmk(n+m))