UOJ Logo hzoi2017_csm的博客

博客

蒟蒻求教

2019-04-15 16:20:49 By hzoi2017_csm

今天被同学丢了一道题:

两个长度为n的数组的内积定义为i=1naibi

假如我们改变两个数组中元素的顺序,不难发现两数组同是递增时内积最大,一个递增一个递减时内积最小。

如果算入相同的内积取值,一共有n!个数,那么这n!个数中第k大的是多少呢?

k的范围可以是1e5或者1e9等等,不设上限,n同样不设上限。

本人太弱了,目前没有找到比O(n!)更优的算法。

自从来到UOJ这个宝地,我的视野变得开阔了,也见识了几位数学大佬,其中肯定不乏富有人类智慧的人士。我相信大佬们一定能给我满意的答案!

求大佬教。

评论

要是a,b可能很大,显然是不可做的QAQ 你令b都是零一,二分一下,你就解决了背包?
评论回复
hzoi2017_csm:复杂度好像已经比O(n!)优秀很多了。 值域是n2,跑一下背包可以达到O(n4+logn)级别。~~又是一道好题~~
根据楼上的观点应该多项式是不行的,但比 O(n!) 优秀的指数算法还是有的。 首先二分答案,考虑计算此时选择方案。 O((nn/2))枚举前 n/2 个a匹配的b位置的集合,分别暴力前一半和后一半的选择方法,然后排序一下二分一下就可以 O((n/2)!poly(n)) 总的复杂度大概是 O(n!/(n/2)!poly(n)) 的,比阶乘稍微好一些。
评论回复
hzoi2017_csm:感谢!
O(klog2n)的做法并已经被人出过 https://godcowc.github.io/2016/06/18/20160618-water/
评论回复
hzoi2017_csm:可是并没有看到题解啊,大佬能指出一个可行的解法吗? 而且能拓展到非排列的情况吗
C_SUNSHINE:回复 @hzoi2017_csm:A和B都是任意非负整数的情况可以证明是NPC的没有多项式做法吧。

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。