hihoCoder Challenge 2 解答

1
1
  • Projection

首先将a排序。那么显然b_i<=b_{i+1}。更多的,我们可以得到,存在l,r使得
1. 对于i < l,b_i=L。
2. 对于 i> r,b_i=R。
3. 对于l <= i <=r,a_i-b_i为常数。

并且,固定r,最优的l可以确定。我们对每个可能的r在O(logn)时间内求出最优的l即可。

可能存在某种形式的单调性,能进一步降低复杂度,不过题目设计为O(nlogn)可以通过所有数据。


  • K个串

keywords: 可持久化线段树,堆

我们对于每个位置i,维护以它为左端点的所有子串的和(注意这里的和均为重复的数字只统计一次),并令c[i]为其为左端点的子串和的最大值。
对于全局最大的和,显然它是所有c[i]的最大值,不妨设为是c[j],这时我们用j为左端点的所有子串中的次大值来更新c[j]。
以上过程重复k次即可找出k大值。
下面考虑如何维护c[i]。首先,我们令b[i]为[1, i]之间所有和,并以b[i]建立一棵线段树T。然后,我们发现,以2为右端点的子串所构成的线段树,就是T将[2, next[1])区间内所有数减ai,T中1位置赋为-inf的线段树,同理3,4...n为左端点的线段树,都可以由上一个修改而来。
于是,可以使用可持久化线段树来维护他们,同时,删除最大值和查询最大值也可轻松实现。而所有c[i]的最大值,使用一个堆来维护就可以了。
总的时间复杂度为O((n+k)lgn)


  • Random Tree

首先固定A和B(要求期望的两个点)。考虑三类边:1. 两个端点是A或B 2. 一个端点是A或B 3. 没有端点是A或B

第一类边被取的概率是2/n。每个第二类边被取的概率是(1-2/n)/(n-2)。考虑第三类边,我们枚举A和B间边的个数k。令P(k)为A到B间边的个数为k的概率。那么期望的第三类边被取的个数是sum((k-2)*P(k))。P(k)可以通过考虑一个大小为(k+1)的连通块和n-k-1个大小为1的连通块的生成树个数求出。

7 answer(s)

0

我觉得Projection的解题报告是错的,因为就算l和r已假定,ai和bi的差值也不一定可以固定,如果aiR+dis的话(其中dis是根据sigma(bi) = C的约束和ai和bi距离差相同所计算得到的(ai-bi))。

0

我十分有幸参加了这场500人斩比赛并贡献一WA

0

第一题高等数学都用上了初二党也就这点本事了……关键是限制条件实在不会……没有限制条件输出((C-sum(a))^2/n妥妥的

  • 这是高等数学吗??

  • 反正高等数学能算,就是一个限制条件求极值的模型,关键是L<bi<R那个条件我实在不会用

  • 智商瞬间沦为中二生……

  • 现在初中的小伙伴都这么强了么T_T

  • 必需的啊。。。拉格朗日乘数法

  • 必须的……关键是L<bi<R这条件我算边界条件也不行……

  • 拉格朗日不行的,题目名字就叫投影,我觉得按投影来做,b所确定的条件就是一个有限的超平面,要求的就是n维空间中A(a1,...an)点到这个超平面的距离。

  • 添加评论
  • reply
0

还会不会有T恤?

0

全部爆0 ,t恤怎么办。

0

可以发下标程吗,谢谢了

0

来自火星发来的贺电:据闻7k+完成五百杀,特来祝贺!

write answer 切换为英文 切换为中文


转发分享