这两张魔法卡的最高技能是什么

What is the maximum skill that these 2 magic cards can play?

本文关键字:高技能 是什么 两张      更新时间:2023-10-16

我正试图用C/C++编写一个程序来解决下面的问题,我想知道我们能用treap来处理它吗?

描述

有2n张魔法卡,每张魔法卡有两个正整数a和b。将这些魔法卡分成2堆,每堆n张。一堆魔法卡所能打出的技能值是堆中最小a和最小b的乘积。你有一种超能力,可以交换魔法卡上的a和b值,并无限期地使用这种能力。你想知道如何将魔法卡分成2堆(你可以使用超能力(。这两张魔法卡的最高技能是什么?

输入

第一个行为是一个正整数n,表示有2n张魔术卡;

接下来的2n行,每行由两个正整数ai、bi组成,表示每个魔术卡上的两个值;

对于60%的数据=n<10^3;

对于100%的数据,1<n<10^5,1<ai、bi<10^9.

输出

输出一个表示最大技能值的正整数。

样本输入

2
1 2
3 4
5 6
7 8

样本输出

32

样本输出意味着1*2+5*6=32


此测试数据由我自己制作:

输入:

3
8 1
2 7
5 4
2 6
4 6
5 3

输出:

17

输出意味着1*5+2*6=17

我将使用结构来实现这一点,让我们看看OJ明天会给出什么结果(可能是TLE(。

以下是问题提示中的一些想法,首先使用超能力将所有卡转换为a<b,按从小到大的值排序。

最小的a固定在第一堆中,并从a的第二小值开始枚举。假设枚举到a[i],则将i之后的所有卡(包括i(放入第二堆,并将i之前的所有卡放入第一堆。

此时,我们需要从第二个堆中选择n-i+1放入第一个堆中。选择的策略如下:

  • 根据b值从小到大对第二个堆的所有卡片进行排序,然后为第一个堆选择第一个n-i+1或下一个n-i+1

事实上,这是为了找到第一个最小b值或n-i+1个大b值的卡。这个过程是用treap来维护的,并且总的时间复杂度是O(nlogn(。