开发者社区> 问答> 正文

遇到一个数组封印的问题,求解答。

Tom 有一个长度为 n 的排列数组 a,即 a 中的每个数字的范围都在 [1,n] 中并且每个数字都不重复。但是现在 Codancer 把整个数组给封印了!现在 Codancer 给了 Tom 一个解封序列 b, 即 bi 代表第 i 次解封 a[b[i]]。接下来Tom每次都会解封一个位置的数字,令L[i]代表第i次解封后所有被解封的数字构成的数组的LIS的长度,现在Codancer想让Tom计算L[1]+L[2]+L[3]+…+L[n] 的值是多少?第一行是一个正整数n,代表a数组和b数组的长度,接下来第一行输入数组a,第二行输入数组 b。(1<=n<=50000)输出 L[1]+L[2]+…+L[n] 的值。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 16:49:11 477 0
1 条回答
写回答
取消 提交回答
  • 第一步解封后数组为 {4},因此 L[1]=1第二步解封后数组为 {4,2},因此 L[2]=1第三步解封后数组为 {4,2,3},因此 L[3]=2第四步解封后数组为 {4,2,1,3},因此 L[4]=2因此 L[1]+L[2]+L[3]+L[4]=6image.png红色数字构成的序列即为 LIS。我们逆向思考,对于给定的数组每次删去一个数,相邻两次操作的答案不会超过 1,对于第i次操作我们随便求一个LIS, 如果第i+1 次操作删除的数字在这个LIS 内,我们就要重新求LIS, 否则答案保持不变,由于随机生成的全排列LIS长度的期望为 sqrt(n),因此最多计算 sqrt(n) 次 LIS。 因此:输入:4 [4,2,1,3] [1,2,4,3] 输出:6 注: L[1]=1解封后为 {4} L[2]=1解封后为 {4,2} L[3]=2解封后为 {4,2,3} L[4]=2解封后为 {4,2,1,3}

    2021-12-23 18:39:25
    赞同 展开评论 打赏
问答分类:
BI
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载