using
System;
using
System.Collections.Generic;
class
Program
{
public
class
PairComparer : IComparer<Tuple<
int
,
int
>>
{
public
int
Compare(Tuple<
int
,
int
> a, Tuple<
int
,
int
> b)
{
return
a.Item1.CompareTo(b.Item1);
}
}
public
static
int
MaxSum4(List<
int
> A, List<
int
> B,
int
X,
int
Y)
{
PriorityQueue<Tuple<
int
,
int
>> hA =
new
PriorityQueue<Tuple<
int
,
int
>>(
new
PairComparer());
PriorityQueue<Tuple<
int
,
int
>> hB =
new
PriorityQueue<Tuple<
int
,
int
>>(
new
PairComparer());
for
(
int
i = 0; i < A.Count; i++)
hA.Enqueue(
new
Tuple<
int
,
int
>(-A[i], i));
for
(
int
j = 0; j < B.Count; j++)
hB.Enqueue(
new
Tuple<
int
,
int
>(-B[j], j));
int
sum = 0;
for
(
int
i = 0; i < X; i++)
{
if
(hB.Count > 0 && (-hA.Peek().Item1 >= -hB.Peek().Item1))
{
sum += -hA.Peek().Item1;
hA.Dequeue();
}
else
{
sum += -hB.Peek().Item1;
hB.Dequeue();
}
}
for
(
int
j = 0; j < Y; j++)
{
if
(hA.Count > 0 && (-hB.Peek().Item1 >= -hA.Peek().Item1))
{
sum += -hB.Peek().Item1;
hB.Dequeue();
}
else
{
sum += -hA.Peek().Item1;
hA.Dequeue();
}
}
return
sum;
}
static
void
Main(
string
[] args)
{
List<
int
> A =
new
List<
int
> { 1, 2, 3, 4, 5 };
List<
int
> B =
new
List<
int
> { 5, 4, 3, 2, 1 };
int
X = 3;
int
Y = 2;
Console.WriteLine(MaxSum4(A, B, X, Y));
}
}
public
class
PriorityQueue<T>
{
private
List<T> data;
private
IComparer<T> comparer;
public
int
Count => data.Count;
public
PriorityQueue(IComparer<T> comparer)
{
this
.data =
new
List<T>();
this
.comparer = comparer;
}
public
void
Enqueue(T item)
{
data.Add(item);
int
ci = data.Count - 1;
while
(ci > 0)
{
int
pi = (ci - 1) / 2;
if
(comparer.Compare(data[ci], data[pi]) >= 0)
break
;
T tmp = data[ci];
data[ci] = data[pi];
data[pi] = tmp;
ci = pi;
}
}
public
T Dequeue()
{
int
li = data.Count - 1;
T frontItem = data[0];
data[0] = data[li];
data.RemoveAt(li);
--li;
int
pi = 0;
while
(
true
)
{
int
ci = pi * 2 + 1;
if
(ci > li)
break
;
int
rc = ci + 1;
if
(rc <= li && comparer.Compare(data[rc], data[ci]) < 0)
ci = rc;
if
(comparer.Compare(data[pi], data[ci]) <= 0)
break
;
T tmp = data[pi];
data[pi] = data[ci];
data[ci] = tmp;
pi = ci;
}
return
frontItem;
}
public
T Peek()
{
T frontItem = data[0];
return
frontItem;
}
}