我的提交记录
B - Graph Partition
当图中存在奇环的时候显然无解(可以考虑x,y之间存在边意味着x与y所属的点集的下标奇偶性不同),否则一定有解。
如果存在划分成k个集合的方案,那么图中必定存在两个点,它们之间的最短路径的边数是k−1。设dis(x,y)表示x,y之间的最短路的边数,1+maxx,y{dis(x,y)}显然是答案的一个上界。
而这个上界是可以达到的。假设dis(x,y)最大,我们把到x的最短路长度等于l的点分入集合Vl+1,就可以得到合法的方案。
C - Division by Two with Something
题目中的操作相当于删去二进制最低位,然后把删去的位取反放在最高位之前。
对于任意的一个数X,它在2N次操作之后都必然会变成它本身。所以,倘若X在d次操作之后变成了它本身,那么X在gcd(d,2N)次操作后一定也变回了它本身。所以,X的最小操作次数一定是2N的约数。
观察发现,对于某一个d∣2N,如果X在d次操作之后变回了本身,那么X一定由d2N段组成,d2N是奇数,且X有如下的形式:AA′AA′⋯A,其中A是一个长度为2d的01串,A′表示A把每一位取反之后得到的结果。
枚举所有的满足d∣N且dN是奇数的d,然后计算2d次操作之后变回本身的数的个数(不要求d是最小操作次数),再通过容斥原理就可以算出2d为最小操作次数的数的个数。
如何判断一个AA′AA′⋯A是否小于等于题目给出的X?先比较前∣A∣位,如果不相同就可以确定A,X的大小关系;否则,由于和X的前∣A∣位都相同的A只有一个,可以暴力O(∣X∣)判断。拓展到对AA′AA′⋯A的计数就是:枚举A与X不同的最高位是哪一位,之后的位可以随意取,并特殊判断X的前∣A∣位和A完全相同的情况。
D - Incenters
对于某一个△ABC,我们作出AB⌢,BC⌢,CA⌢的中点C′,A′,B′。则有△ABC的内心与△A′B′C′的垂心重合。
证明:

显然AA′,CC′,BB′是△ABC的内角平分线,所以γ=21∠ABC,α=21∠BCA,β=σ=21∠BAC。
而ε=β+γ+α=21(∠ABC+∠BCA+∠CAB)=90∘,所以BB′⊥C′A′。
同理可证明CC′⊥A′B′,AA′⊥C′B′。所以AA′,BB′,CC′的交点为△A′B′C′的垂心。
所以只需要算出△A′B′C′的垂心的期望即可。
令△A′B′C′的外心为O,重心为G,垂心为H,根据欧拉线我们有G=32O+H(将点看做向量进行的加减乘除),也就是H=3G−2O。由于O=(0,0),G=3A′+B′+C′,只要考虑每一个A′的贡献就可以得到答案。
时间复杂度O(n2)。
E - Pairing Points
一个写得很好的博客
首先枚举与1配对的点,然后把1所在的线段删掉(图中虚线标出的),然后考虑那些与1所在的线段有交的线段(图中粗的黑线),发现剩下的的点一定恰好只与这些线段中的一条连通,并且与每一条线段连通的点集一定是两个连续的区间的并。

设g[a][b][c][d]表示把[a,b]∪[c,d]中的点连成一个连通块,并且要求有且仅有一条边的两端在两个区间内。为了辅助转移,再设f[a][b][c][d]=∑a≤x<b,c<y≤dg[a][x][y][d]⋅f[x+1][b][c][y−1],表示[a,b]∪[c,d]为若干个合法的连通块“首尾”相邻拼起来的方案数。
考虑g的转移(如下图):我们枚举跨越两个区间的边(x,y),则[a,x−1]∪[x+1,b]和[c,y−1]∪[y+1,d]成为了两个互相独立的子问题,并且要求[a,x−1]∪[x+1,b]划分成若干个合法的连通块,[c,y−1]∪[y+1,d]划分成若干个合法的连通块:这就是f[a][b][c][d]的定义。所以我们得到
g[a][b][c][d]=a≤x≤b,c≤y≤d∑f[a][x−1][x+1][b]⋅f[c][y−1][y+1][d]

最后的答案就是∑if[2][i−1][i+1][2n]。
时间复杂度O(n6)
F - Min Product Sum
考虑题目中给出的权值的组合意义:相当于对于一个确定的矩阵A和一个还没有确定的矩阵B,A的权值等于有多少种往B中填数的方案,使得Bi,j不大于A中与它在同行或者同列的任何一个数。
而这个填数的条件等价于:对于每一行,B的最大值小于等于A的最小值;对于每一列,B的最大值小于等于A的最小值。
枚举每一列A的最小值Yi,并要求这一列的B的所有元素都不超过它;枚举每一行B的最大值Xi,并要求这一行的A的元素都不小于它。这与前面的条件仍然是等价的。
对于某一个格子Ai,j,如果Xi>Yj,就在枚举Xi的时候考虑它的贡献;如果Xi<Yj,就在枚举Yj的时候考虑它的贡献;如果Xi=Yj,我们规定在枚举Yj的时候考虑它的贡献。对于某一个格子Bi,j,如果Xi≤Yj,就在枚举Xi的时候考虑它的贡献,否则就在枚举Yj的时候考虑它的贡献。
我们先将行按照Xi排序,列按照Yi排序。枚举每一个Xi的时候,需要考虑贡献的格子就会有如下的形式(并且右侧的格子每一行要求至少有一个元素取到最大值):

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

发现:
- 枚举每一个Xi的时候,需要考虑的格子的总数量是m;枚举每一个Yi的时候,需要考虑的格子的总数量是n。
- 枚举每一个Xi的时候,A中需要考虑的格子的数量等于Yj中满足Yj<Xi的j的数量;枚举每一个Yi的时候,A中需要考虑的数量等于满足Xj≤Yi的j的数量。
设f[t][i][j][0]表示X1,X2,⋯Xi,Y1,Y2⋯Yj已经确定,且Xi<t,Yj<t的方案数;f[t][i][j][1]表示X1,X2,⋯Xi,Y1,Y2⋯Yj已经确定,且Xi≤t,Yj<t的方案数。对f[t][i][j][0],枚举Xi=t的行数进行转移;对f[t][i][j][1],枚举Yj=t的列数进行转移。
总时间复杂度O(nmk(n+m))。