网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月13日漏签0天
c++吧 关注:619,270贴子:2,111,353
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 24回复贴,共1页
<<返回c++吧
>0< 加载中...

求求各位大佬

  • 只看楼主
  • 收藏

  • 回复
  • 《北偏南》
  • ?:
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这段代码该怎么提速啊



  • 《北偏南》
  • ?:
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶


2025-06-13 21:43:55
广告
  • 乱码lby
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你嫌别人看得见?


  • 夏吸吸
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你嫌别人看得见?


  • 暑假的亟待解决
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
向量化加速了解一下


  • ZXP4
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
……没有样例和数据范围吗?
我觉得这道题不是提速不提速的问题,因为暴力做法的时间复杂度就是 O(nlogn) (排序),已经足够快了。
如果假定 a[i] >= 0, b[i] >= 1,那么我可以提供一种思路。
首先,为了得到尽可能大的结果,显然我们需要对两个输入数组进行降序排序,从大到小选择元素,也就是取这两个数组的前缀。我们总共需要取 k 个元素,所以这两段前缀的长度之和为 k。
然后考虑暴力做法,即枚举 k + 1 种可能性找最大值。
显然,我们并不能直接把当前结果计算出来,因为它可能会非常大,以至于 long long 甚至 __int128 都无法存储(不考虑使用高精度)。这就是本题的难点——如何在不直接计算出结果的前提下,比较当前结果和其他结果的大小呢?
假设我们当前在数组 a 取了长度为 t 的前缀,那么相应地就需要在数组 b 取长度为 k - t 的前缀。那么,当前结果的表达式为:……(见下图)
如果我们在数组 a 取长度为 t+1 的前缀呢?
记这两次结果分别为 A_t 和 A_{t+1}:

为了比大小,作差:

因为我们的目的是比大小,所以关注结果的符号,显然符号只和右边的部分有关:

注意数组 a, b 已经过降序排序,有:

当 t > 0 时,若 b_{k-t} = 1,则符号就是 a_{t+1} 的符号,而 a_{t+1} >= 0,所以此时 A_{t+1} >= A_t;若 b_{k-t} >= 2,则 A_{t+1} <= A_t (简单的放缩可得)。
当 t = 0 时,上式等于:

我们发现,如果 b_k = 1,则 A_1 >= A_0。
想象 b 数组,它类似 ..3, 3, 2, 2, 1, ...,1, 1,根据前面的分析,当 t > 0 且 b_{k-t} 为 1 时,始终有 A_{t+1} >= A_t,且 A_1 >= A_0。如果记最大的 t = t0,使得 b_{k-t} = 1,则对于所有的 0 <= t <= t0,都有 A_{t+1} >= A_t 成立!此时数列 {A_t} 是不下降的,因此最大值就是 A_t0。
如果 b_k >= 2 呢?因为 b 数组是降序排序的,所以此时 b 数组的所有元素都大于等于 2。根据前面的分析,当 t > 0 时,都有 A_{t+1} <= A_t,此时数列 {A_t} 是不上升的,因此最大值就是 max(A_0, A_1)。
所以,我们需要算出 A_0,A_1 然后比大小吗?不用。
还记得上面这张图吗?

我们可以代入 b_k,a_1 和 x,就能知道 A_0 和 A_1 谁更大。(这应该不太可能溢出吧)


  • 《北偏南》
  • ?:
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
修改后的代码以及数据范围



  • ZXP4
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是我根据自己的思路写出的代码(题目没有给数据下限,这里我假定 a[i] >= 0, b[i] >= 1,否则会超级麻烦):

因为缺乏足够的测试数据,在通过样例的基础上,我写了个对拍。
gen.py 用于生成测试数据:

bf.py 是朴素做法,用于生成标准答案(python 自带高精度,所以中间结果不需要取余):

checker.py 用于对比我的程序输出的结果和标准答案的差异:

这里用 1e4 规模的数据进行对拍(否则会很慢而且可能内存不够用):

测了 1000 组数据暂时没发现什么问题。


2025-06-13 21:37:55
广告
  • Julius
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你电脑是没有截图功能?


  • 换个名字水经验
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先学截屏吧


  • waadsjiaj
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
怎么编程题也有原啊,好怪哦


  • SuperLy114
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有什么复杂的过程,最多用内联优化一点函数调用;
要显著优化速度,估计只能从算法上考虑了。有没有可并行环节,看看能否多线程?
另外,这么大的数组,是不是快爆栈了


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 24回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示