2019牛客暑期多校训练营(第一场)

RankSolvedABCDEFGHIJ
13/8916/10OOOØOOØØØO

O: 当场通过

Ø: 赛后通过

.: 尚未通过

A Equivalent Prefixes

solved by chelly


chelly’s solution

二分答案,建立前缀的笛卡尔树,判断笛卡尔树是否相同。时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)


viscaria’s solution

考虑前面k个数已经equal,加入第k+1个数对前面的影响,设从后往前第一个比第k+1个数小的数为ki,那么第k+1个数影响的区间范围就是[i+1,k+1],如果他们仍要equal,那么2个序列加入的数对区间的影响应该是一模一样的。用单调栈维护一下,可以O(n)的求出。

B Integration

solved by chelly


chelly’s solution

比赛时候通过WolframAlpha算积分找规律的……


viscaria’s solution
有这么一个公式 ∏ i = 1 n 1 a i 2 + x 2 = ∑ i = 1 n c i a i 2 + x 2 \prod _ {i=1} ^n \frac{1}{a_i^2+x^2}=\sum _ {i=1} ^n \frac{c_i}{a_i^2+x^2} i=1nai2+x21=i=1nai2+x2ci

并且 ∫ 0 ∞ c i a i 2 + x 2 = c i π 2 a i \int_0^\infty \frac{c_i}{a_i^2+x^2}=\frac{c_i\pi}{2a_i} 0ai2+x2ci=2aiciπ

所以我们想要积分 ∫ 0 ∞ ∏ i = 1 n 1 a i 2 + x 2 \int_0^\infty \prod _ {i=1} ^n \frac{1}{a_i^2+x^2} 0i=1nai2+x21

那么可以转化为积分 ∫ 0 ∞ ∑ i = 1 n c i a i 2 + x 2 = ∑ i = 1 n c i π 2 a i \int_0^\infty \sum _ {i=1} ^n \frac{c_i}{a_i^2+x^2}=\sum _{i=1}^n \frac{c_i\pi}{2a_i} 0i=1nai2+x2ci=i=1n2aiciπ

现在的问题就是求 c i c_i ci

∏ i = 1 n 1 a i 2 + x 2 = ∑ i = 1 n c i a i 2 + x 2 \prod _ {i=1} ^n \frac{1}{a_i^2+x^2}=\sum _ {i=1} ^n \frac{c_i}{a_i^2+x^2} i=1nai2+x21=i=1nai2+x2ci

我们可以在等式2边同时乘以 ∏ i n a i 2 + x 2 \prod_i^na_i^2+x^2 inai2+x2,那么就有

1 = ∑ i = 1 n c i ∗ ∏ j = 1 n ( a j 2 + x 2 ) , ( j ! = i ) 1=\sum _ {i=1} ^n c_i*\prod_{j=1}^n(a_j^2+x^2),(j!=i) 1=i=1ncij=1n(aj2+x2),(j!=i)

此时我们令 x 2 = − a i 2 x^2=-a_i^2 x2=ai2,有

1 = c i ∗ ∏ j = 1 n ( a j 2 − a i 2 ) , ( j ! = i ) 1=c_i*\prod_{j=1}^n(a_j^2-a_i^2),(j!=i) 1=cij=1n(aj2ai2),(j!=i),即

1 ∏ j = 1 n ( a j 2 − a i 2 ) = c i , ( j ! = i ) \frac{1}{\prod_{j=1}^n(a_j^2-a_i^2)}=c_i,(j!=i) j=1n(aj2ai2)1=ci,(j!=i)

这里 n < = 1 e 3 n<=1e^3 n<=1e3直接暴力O(n)求 c i c_i ci然后,然后再重复n次求出所有就行了,复杂度 O ( n 2 ) O(n^2) O(n2)

C Euclidean Distance

solved by viscaria&chelly


chelly’s solution

我们要优化的式子如下:
min ⁡    z = ∑ i = 1 n ( x − a i m ) 2 s . t . { ∑ i = 1 n x i = 1 , x i ≥ 0 ( j = 1 , 2 , 3 , ⋯   , n ) . \begin{aligned} &\min\,\, z=\sum_{i=1}^n (x-\frac{a_i}{m})^2\\ &s.t.\quad \begin{cases} \sum\limits_{i=1}^n x_i = 1 , \\ x_i \geq 0 & (j=1,2,3,\cdots,n). \end{cases} \end{aligned} minz=i=1n(xmai)2s.t.i=1nxi=1,xi0(j=1,2,3,,n).

利用拉格朗日乘子法解决带不等式约束的多元函数极值问题,构造拉格朗日函数:
L ( x , μ , λ ) = ∑ i = 1 n ( x i − a i m ) + μ ( ∑ i = 1 n x i − 1 ) − ∑ i = 1 n λ i x i L(x,\mu,\lambda)=\sum_{i=1}^{n}(x_i-\frac{a_i}{m})+\mu(\sum_{i=1}^nx_i-1)-\sum_{i=1}^n \lambda_ix_i L(x,μ,λ)=i=1n(ximai)+μ(i=1nxi1)i=1nλixi
那么我们要优化的问题就变成了:
min ⁡ x   max ⁡ λ , μ    L ( x , μ , λ ) s . t . λ i ≥ 0 \begin{aligned} & \min_x \ \max_{\lambda , \mu}\,\, L(x,\mu,\lambda)\\ &s.t.\quad \lambda_i \geq 0 \end{aligned} xmin λ,μmaxL(x,μ,λ)s.t.λi0
由于这里的代价函数和约束函数都是凸函数,所以满足强对偶关系,于是我们要优化的式子就变成了:
max ⁡ λ , μ   min ⁡ x      ∑ i = 1 n ( x i − a i m ) + μ ( ∑ i = 1 n x i − 1 ) − ∑ i = 1 n λ i x i s . t . λ i ≥ 0 \begin{aligned} & \max_{\lambda , \mu}\ \min_x \ \,\, \sum_{i=1}^{n}(x_i-\frac{a_i}{m})+\mu(\sum_{i=1}^nx_i-1)-\sum_{i=1}^n \lambda_ix_i\\ &s.t.\quad \lambda_i \geq 0 \end{aligned} λ,μmax xmin i=1n(ximai)+μ(i=1nxi1)i=1nλixis.t.λi0
里面是关于 x x x的无约束二次函数,直接可以求得最小值,于是问题变成了优化如下式子:
max ⁡ λ , μ   ∑ i = 1 n − ( μ − 2 a i m − λ i ) 2 4 + ∑ i = 1 n ( a i m ) 2 − μ s . t . λ i ≥ 0 \begin{aligned} & \max_{\lambda , \mu}\ \sum_{i=1}^n \frac{-(\mu - \frac{2a_i}{m}-\lambda_i)^2}{4} + \sum_{i=1}^n(\frac{a_i}{m})^2-\mu \\ &s.t.\quad \lambda_i \geq 0 \end{aligned} λ,μmax i=1n4(μm2aiλi)2+i=1n(mai)2μs.t.λi0
注意到,当固定某个 μ \mu μ的时候,所有 λ i \lambda_i λi的最优值取值是固定的,这实际上取决于是否满足 μ ≥ 2 a i m \mu \geq \frac{2a_i}{m} μm2ai,于是这是关于 μ \mu μ的分段函数,分段求极值即可。注意避免使用分数类,不然会超时。


viscaria’s solution

考虑我们这个p能对答案 ∑ i = 1 n ( a i m − p i ) 2 \sum_{i=1}^n(\frac{a_i}{m}-p_i)^2 i=1n(maipi)2造成什么影响

很明显,我们这个是一个n个数的平分和,我们想要他们的和最小。那么我想要每个数都往原点靠

但是不幸的是,p大于0,也就意味着我们只能让这些数减小(减小的总和为p),考虑正数减小,那么和一定减小,考虑负数减小,那么和一定增大。那么我们一定先移正数

我们先移哪些正数呢?先移最大的,因为移动同样的距离,这个数减小得最大

如果我们正数都移到原点了,但是p还没有用完,那我们不得不减小这些负数,我们要考虑怎么移让我们损失最小,也就是加的比较小。那就移距离原点比较近的。

总的来说,我们可以这样计算

1.计算当前点堆能否移动到下一个刚好比他小的点那里里去(因为我们把最大的那个数移到倒数第二大的数的时候,就有2个最大的数了,所以在接下来的操作中,我们应该对这个点堆进行操作,点堆移动的花费应该等于移动的距离乘以点的数量)

2.如果不能,计算最多能移动到哪里,然后break

3.如果可以,更新点堆与花费

最后我们可以得到每个数在哪里,然后计算就可以了

注意答案要求输出分数,其实我们不用维护一个分数类,为什么呢?

因为最后的点的位置一定是一些离散的点加上一个聚在一起的点堆形成的,离散的点就是初始位置,很容易用分数表示,点堆的的话,就等于这堆点的初始位置的和(很容易表示为一个分数)减去p,然后除以点堆数量就行了

D Parity of Tuples

upsolved by chelly


chelly’s solution

首先 c o u n t ( x ) = 1 2 m ∑ i = 1 n ∏ j = 1 m ( 1 − ( − 1 ) ∣ a i , j & x ∣ ) count(x)=\frac{1}{2^m}\sum_{i=1}^n \prod_{j=1}^m(1-(-1)^{|a_{i,j}\&x|}) count(x)=2m1i=1nj=1m(1(1)ai,j&x)
我们可以计算出 c o u n t ( 0.. 2 k − 1 ) count(0..2^k-1) count(0..2k1),然后问题就解决了。
f ( x ) = ∑ i = 1 n ∏ j = 1 m ( 1 − ( − 1 ) ∣ a i , j & x ∣ ) = ∑ i = 1 n ∑ S ( − 1 ) ∣ S ∣ ( − 1 ) ∑ j ∈ S ∣ a i , j & x ∣ = ∑ i = 1 n ∑ S ( − 1 ) ∣ S ∣ ( − 1 ) ∣ ( ⊕ j ∈ S a i , j ) & x ∣ = ∑ V = 0 2 k − 1 ( − 1 ) ∣ V & x ∣ ( ∑ i = 1 n ∑ S ( − 1 ) ∣ S ∣ [ ( ⊕ j ∈ S a i , j ) = = V ] ) \begin{aligned} f(x) &= \sum_{i=1}^n \prod_{j=1}^m(1-(-1)^{|a_{i,j}\&x|}) \\ &= \sum_{i=1}^n \sum_S (-1)^{|S|}(-1)^{\sum_{j \in S} |a_{i,j}\&x|} \\ &= \sum_{i=1}^n \sum_S (-1)^{|S|}(-1)^{|(\oplus_{j \in S}a_{i,j}) \& x|} \\ &= \sum_{V=0}^{2^k-1}(-1)^{|V\& x|}(\sum_{i=1}^n\sum_S(-1)^{|S|}[(\oplus_{j \in S}a_{i,j})==V]) \end{aligned} f(x)=i=1nj=1m(1(1)ai,j&x)=i=1nS(1)S(1)jSai,j&x=i=1nS(1)S(1)(jSai,j)&x=V=02k1(1)V&x(i=1nS(1)S[(jSai,j)==V])
注:上面第2行推到第3行是基于这样一个事实: ∣ a & x ∣ + ∣ b & x ∣ ≡ ∣ ( a ⊕ b ) & x ∣   ( m o d   2 ) |a\&x|+|b\&x|\equiv|(a \oplus b)\&x| \ (mod \ 2) a&x+b&x(ab)&x (mod 2)

于是我们可以先构造 F ( V ) = ∑ i = 1 n ∑ S ( − 1 ) ∣ S ∣ [ ( ⊕ j ∈ S a i , j ) = = V ] F(V)=\sum_{i=1}^n\sum_S(-1)^{|S|}[(\oplus_{j \in S}a_{i,j})==V] F(V)=i=1nS(1)S[(jSai,j)==V],然后对 F ( V ) F(V) F(V)进行FWT,就可以得到每个 f ( x ) f(x) f(x)了,于是可以计算每个 c o u n t ( x ) count(x) count(x)了。
注意计算 F ( V ) F(V) F(V)的时候,直接for循环枚举暴力是 O ( n m 2 m ) O(nm2^m) O(nm2m)的,会TLE,可以利用dfs减少无用的枚举,将复杂度变成 O ( n 2 m ) O(n2^m) O(n2m)
总的时间复杂度是 O ( n 2 m + k 2 k ) O(n2^m+k2^k) O(n2m+k2k)的。

E ABBA

solved by chelly


chelly’s solution


viscaria’s solution

我们考虑一个合法的序列的前缀,用f(x,y)表示前面有x个A,y个B

我们可以很容易判断出一些前缀是不合法的,哪些前缀呢?

例如在n=1,m=2的情况下,f(2,0),f(3,1)就是一个不合法的前缀,因为前缀至少会给后面留下2个前面的A,而我们只要一个AB

而我们每一个合法的前缀都是由一个更短的合法的前缀转化而来的,例如f(i,j)=f(i,j-1)+f(i-1,j),这代表什么意思呢?

我们在一个合法前缀的最后一个数要么是A要么是B

那么这个合法前缀的数量就是枚举最后一个是A的时候,就转化为f(i-1,j)
枚举最后一个是B的时候,就转化为f(i,j-1)

F Random Point in Triangle

solved by viscaria


viscaria’s solution

首先考虑一个三角形,在三角形内随机取一点p, S Δ a b p S\Delta{abp} SΔabp的期望为 S Δ a b c 3 \frac{S\Delta{abc}}{3} 3SΔabc

在这里插入图片描述
问题就是计算以BC为底的时候,高为h的时候 S Δ P B C S\Delta PBC SΔPBC的期望
设AB中点为D,AC中点为E,重心为O,三角形总面积为S

E ( S Δ P B C ) = E ( S Δ P B ‘ C ‘ + B C ∗ H / 2 ) E(S\Delta PBC)=E(S\Delta PB^`C^`+BC*H/2) E(SΔPBC)=E(SΔPBC+BCH/2)
= E ( S Δ P B ‘ C ‘ ) + B C ∗ H / 2 =E(S\Delta PB^`C^`)+BC*H/2 =E(SΔPBC)+BCH/2
= E ( S Δ P B ‘ C ‘ ) + B C ∗ H / 2 =E(S\Delta PB^`C^`)+BC*H/2 =E(SΔPBC)+BCH/2
= E ( S Δ P D E ) ∗ 2 + B C ∗ H / 2 =E(S\Delta PDE)*2+BC*H/2 =E(SΔPDE)2+BCH/2
= E ( ( S Δ A D E − S Δ O D E ) / 3 ) ∗ 2 + B C ∗ H / 2 =E((S\Delta ADE-S\Delta ODE)/3)*2+BC*H/2 =E((SΔADESΔODE)/3)2+BCH/2(根据开头的引理)
= ( ( S Δ A D E − S Δ O D E ) / 3 ) ∗ 2 + B C ∗ H / 2 =((S\Delta ADE-S\Delta ODE)/3)*2+BC*H/2 =((SΔADESΔODE)/3)2+BCH/2
= S / 6 − S / 18 + S / 2 =S/6-S/18+S/2 =S/6S/18+S/2
= 11 S / 18 =11S/18 =11S/18

对称性可知,在其他区域期望也一样

G Substrings 2

upsolved by chelly


chelly’s solution

H XOR

upsolved by chelly


chelly’s solution

很容易想到维护前缀线性基、后缀线性基,然后枚举i,将pre[i-1]和suf[i+1]合并起来,那么i对应的答案就可以求出来了,但这样是 O ( 6 4 2 n ) O(64^2n) O(642n)的,因为线性基合并是 O ( 6 4 2 ) O(64^2) O(642)的,需要进一步优化。
事实上,在我们求pre[i]的过程中,pre[i]与pre[i-1]不同的位置最多只有64个,也就是说处理pre[i]=pre[i-1]的询问i的时候,我们不需要合并线性基,直接拿所有数字的线性基过来用即可。时间复杂度 O ( 6 4 3 + 64 n ) O(64^3+64n) O(643+64n)

I Points Division

upsolved by chelly


chelly’s solution

一定存在一条xy单调不降的折线把点集划分为AB两个部分,不妨假设折线贴着集合B进行DP。dp[i]表示以i点为最后的最大值,枚举上一个点j,那么需要统计所有 x j < x k < x i , y k < y j x_j<x_k<x_i, y_k<y_j xj<xk<xi,yk<yj的所有点的权值。我们可以拿个线段树维护目前所有点对目前点的dp贡献。可以对y坐标离散后建线段树,tree[y]是目前为止最右边的 x y = y x_y=y xy=y的点的贡献。修改就是区间加(加入一个点,要给其左上角所有点加上权值)、单点覆盖(加入一个点,更新 d p [ x y ] dp[x_y] dp[xy]),询问就是区间询问最大值。注意x值相同的点要一起处理。
时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

J Fraction Comparision

solved by chelly


chelly’s solution

__int128签到

Dirty Replay

  • A题题意先看错了,WA了一发
  • H题卡常,补题的时候T了很多发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值