2019牛客暑期多校训练营(第一场)
A.Equivalent Prefixes
solved by RDC 42min -1, assisted by F0_0H
题意 给两个序列,求最长前缀使得笛卡尔树相同。
做法1 二分前缀,建笛卡尔树。
做法2 递归地计算 ([l,r]) 区间内,最长笛卡尔树相等的前缀。查询两个序列在 ([l,r]) 区间内,最小值的位置,设分别为 (p_1,p_2),若 (p_1 eq p_2),递归到 ([l,max(p1,p2)-1]),否则递归到 ([l,p_1-1]) 若在 ([l,p_1-1]) 上两序列笛卡尔树相同则递归到 ([p_1+1,r])。
B. Integration
upsolved
做法
- 欲求(c_i),使(sum_{i=1}^{n}frac{c_i}{a_i^2+x^2}=frac{1}{prod_{i=1}^{n}(a_i^2+x^2)})
- 通分后分子相等:(sum_{i=1}^{n}c_iprod_{j!=i}(a_j^2+x^2)=1)
- 令(x^2=-a_i^2),代入得到(c_iprod_{j!=i}(a_j^2-a_i^2)=1)
- 即(c_i=frac{1}{prod_{j!=i}(a_j^2-a_i^2)})
C.Euclidean Distance
solved by RDC 245min, assisted by F0_0H
题意 求点到高维平面区域最近距离。
做法
- 如果点向平面垂足在区域内,那么找到最优解。
- 否则最优解一定在边界上,即某些维上坐标为 0.
- 对距离的表达式展开,注意到在 (a_i) 最小的 (k) 维上坐标为 0 是最优的,那么我们需要放逐掉几个维度呢?
- 二分 (k) 值,寻找最小的 (k) 使得,点向平面的垂足在区域内。
- 更大的 (k) 不如当前解优,更小的 (k) 表示最优解在边界上。
D. Parity of Tuples
upsolved by 题解
题意 n个m元组(v_1,v_2,...,v_n),其中(v_i=(a_{i,1},a_{i,2},...,a_{i,m}))对于x,求有多少个元组(v_i)满足对于所有j,(a_{i,j} and x)有奇数个1,对(0≤x<2^k)都求其答案
做法
- 构造长度为(2^k)的数组(F),考虑元组((a_1,a_2,...,a_m))
- 对于所有子集S,把(F[igoplus_{iin S}a_i])加上((-1)^{|S|})
- 对F做FWT,(FWT(F)[x]/2^m)就是答案
正确性证明 by sdcgvhgj
- 考虑元组((a_1,a_2,...,a_m))的子集S对(FWT(F)[x])的贡献
- FWT变换的定义:(FWT(F)[x]=sum_{i=0}^{n}(-1)^{|iigcap x|}F_i)
- 所以贡献为:((-1)^{|(igoplus_{iin S}a_i)igcap x|}*(-1)^{|S|})
- (=(-1)^{|igoplus_{iin S}a_iigcap x|}*(-1)^{|S|}),(igcap)对(igoplus)有分配率
- (=(-1)^{sum_{iin S}|a_iigcap x|}*(-1)^{|S|}),x和y中1的个数和的奇偶性和x⨁y中1的个数的奇偶性是一样的。
- (=(-1)^{sum_{iin S}1+|a_iigcap x|})
- (=prod_{iin S}(-1)^{1+|a_iigcap x|})
- 所有S对(FWT(F)[x])的贡献之和(=sum_Sprod_{iin S}(-1)^{1+|a_iigcap x|})
- (=prod_i(1+(-1)^{1+|a_iigcap x|}))
- 若(|a_iigcap x|)全为奇数则值为(2^m),否则为0
E.ABBA
upsolved by RDC
题意 有多少个长度为 (2(n+m)) 的AB序列,可以划分成 (n) 个 (AB) 子序列,(m) 个 (BA) 子序列。
做法
- 一个序列能成功划分,等价于可以进行如下的贪心匹配,让前 (n) 个 (A) 字符,参与 (AB) 串,后 (m) 个 (A) 字符,参与 (BA) 串的构造,(B) 字符类似。于是只要知道了一个字符的在同类中的 rank 就能知道它该匹配谁。
- (dp[x][y]) 表示长度为 (x+y) 的,有 (x) 个 (A),(y) 个 (B) 的前缀,不违背以上匹配规则的,方案数。
- 枚举下一个字符是啥。
F.Random Point in Triangle
solved by sdcgvgj 61min
题意 三角形内随机选点到与三边形成的三角形的最大值的期望。
做法 E = S*22/36
H.XOR
upsolved by RDC
题意 给 (n) 个元素,输出异或和为 0 的集合 size 之和。
做法
- 插入线性基,记录主元所在的行由哪些元素异或而得(至多维数个)。
- 记录全为 0 的行,由哪些元素异或而得(至多维数个)。
- 考虑暴力,我们枚举取哪些全是 0 的行。
- 考虑优化,按位算贡献即可。
夕阳红
- 比赛时写了个 1<<62。
- 试图绝杀的时候,不会算 (sum_{i=1}^{n} iC_{n}^{i})
I.Points Division
upsolved by F0_0H
题意 二维平面上给定n个点,每个点有两个属性((a[i], b[i])),要求用一条单调递增的折线把平面分成两部分,最大化(上半部分的(a[i])和 (+) 下半部分的(b[i])和)
题解
- 首先对数据离散化
- (DP[i][j][0]) 表示考虑前(i)行,折线最高点在第(j)列下方一丢丢的最大值
- (DP[i][j][1]) 表示考虑前(i)行,折线最高点在第(j)列上方一丢丢的最大值
- (DP[i][j][0] = max(max_{1leq jleq i}DP[i-1][j][0], max_{1leq j leq i-1}DP[i-1][j][1])+sum_{jleq kleq n}a[i][k]+sum_{1leq kleq j-1}b[i][k])
- (DP[i][j][1] = max(max_{1leq j leq i}DP[i-1][j][0], max_{1leq j leq i}DP[i-1][j][1])+sum_{j+1leq kleq n}a[i][k]+sum_{1leq kleq j}b[i][k])
- 线段树维护转移
J.Fraction Comparision
solved by F0_0H 9 min
题意 比较两分数大小
题解 简单签到,随便搞