1 | for(int i=0;i<2*m;i++){ |
我二分答案的,先二分第一个值,然后二分第二个值,千万注意存在数值相同的情况, 我们考虑数对(x,y)的最大排名,显然我们用upper_bound找到x和y的位置,然后lower_boundx的位置,然后就能根据这三个值算出(x,y)的排名了
第四题
伪中位数, 我们定义排名为$\lfloor\frac{n+1}{2}\rfloor$的数为伪中位数,给你一个数组a[]和一个数k,问你至少在a中添加多少个数一个k成了a[]的伪中位数,我们统计小于k的数x个,大于k的数y个,然后执行下面的程序,去模拟这个过程,不知道为啥,我这题没有通过,卡在了56%的位置,挺遗憾的,就差一点点就AK了
1 | x // 小于k的数的个数 |
第五题
输入串S和T,在S中选一个子序列s,在T中选一个子串t,问有多少个选法,使得s=t,答案对1e9+7取模
设dp[i][j]为S[0:i], T[0:j] 且必须选T的结尾的字符的情况下的方案数量, 那么
1 | dp[i][j] = S[0:i] 中S[?]==T[j]的个数 再加上下面的 |
现在我们就可以写出一个$n^3$复杂度的算法了
考虑优化它,设Sum[i][j] 为 dp[k-1][j-1] 在k<=i且S[k]==T[j]的和, 然后推导
1 | Sum[i][j] = Sum[i-1][j] |
现在我们得到了双线dp,这两个dp互相向后推导,最终得出答案,复杂度$n^2$
2020/4/19更新
感谢指正,我想复杂了,我还是太菜了
2020/4/17更新
一觉醒来挺多人找我要代码的,由于笔试的代码没有复制,所以我就重新敲一遍
##第二题
1 |
|
第三题
1 |
|
第五题
1 |
|
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/Q8VYLN.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!