美团笔试0816
不得不说题目真的有点难了
第二题:
贪心,开两个multiset,分别存A和B,每次取出A和B最大的,如果A的最大值大于B最大值,A最大值丢弃并将原最大值执行操作丢回set,计数+1;如果B最大值大于A最大值,B最大值丢弃并将原最大值执行操作丢回set,计数+1;如果相等,则分别丢弃最大值,计数值不变。最后输出计数值
第三题:
线段树可以做,但是很麻烦#牛客AI配图神器#。有点类似于线段树求逆序对或线段树求最长上升子序列,需要维护对于某个i,在此前遍历的j>i有多少个比i大或小。首先复制一份排序后的数组,从后往前遍历,每个位置j,把所有右边比它大的顺序(k>j,且idx(a[k])>idx(a[j]))的idx(a[k])(idx(x)表示数组排序后,x所在位置)都+1(参考线段树区间逐元素加一个值的维护方式,带染色标记)。这里要注意的是,比某个数大的,在右边未必出现过,所以未出现的地方一开始要用负无穷初始化,出现后才置为整数,然后在线段树递归更新查询的时候维护一个判断条件,为正数才累计求和。这样,遍历到i的时候,可以算出i到k之间,有多少个j产生了贡献,然后把所有k的值求和,就可以了。
第二题:
贪心,开两个multiset,分别存A和B,每次取出A和B最大的,如果A的最大值大于B最大值,A最大值丢弃并将原最大值执行操作丢回set,计数+1;如果B最大值大于A最大值,B最大值丢弃并将原最大值执行操作丢回set,计数+1;如果相等,则分别丢弃最大值,计数值不变。最后输出计数值
第三题:
线段树可以做,但是很麻烦#牛客AI配图神器#。有点类似于线段树求逆序对或线段树求最长上升子序列,需要维护对于某个i,在此前遍历的j>i有多少个比i大或小。首先复制一份排序后的数组,从后往前遍历,每个位置j,把所有右边比它大的顺序(k>j,且idx(a[k])>idx(a[j]))的idx(a[k])(idx(x)表示数组排序后,x所在位置)都+1(参考线段树区间逐元素加一个值的维护方式,带染色标记)。这里要注意的是,比某个数大的,在右边未必出现过,所以未出现的地方一开始要用负无穷初始化,出现后才置为整数,然后在线段树递归更新查询的时候维护一个判断条件,为正数才累计求和。这样,遍历到i的时候,可以算出i到k之间,有多少个j产生了贡献,然后把所有k的值求和,就可以了。
全部评论
第三题如果做过三维偏序就很简单,用cdq+树状数组就行,考虑对[l,r]时贡献,i位于[l,mid],k位于[mid+1,r],然后分类讨论下j位于左右的求值方法即可。
第二题用优先队列写只过了0.45
还不是T, 调不出来
相关推荐

点赞 评论 收藏
分享
08-16 22:53
东南大学 算法工程师 点赞 评论 收藏
分享