using
System;
using
System.Collections.Generic;
class
GFG
{
static
List<
int
> MaximizeArray(
int
[] arr1,
int
[] arr2,
int
n)
{
List<
int
> ans =
new
List<
int
>();
HashSet<
int
>
set
=
new
HashSet<
int
>();
PriorityQueue<
int
> pq =
new
PriorityQueue<
int
>((x, y) => y.CompareTo(x));
foreach
(
int
i
in
arr1)
pq.Enqueue(i);
foreach
(
int
i
in
arr2)
pq.Enqueue(i);
while
(
set
.Count != n)
set
.Add(pq.Dequeue());
foreach
(
int
i
in
arr2)
{
if
(
set
.Contains(i))
{
ans.Add(i);
set
.Remove(i);
}
}
foreach
(
int
i
in
arr1)
{
if
(
set
.Contains(i))
{
ans.Add(i);
set
.Remove(i);
}
}
return
ans;
}
public
static
void
Main(
string
[] args)
{
int
[] arr1 = { 7, 4, 8, 0, 1 };
int
[] arr2 = { 9, 7, 2, 3, 6 };
List<
int
> result = MaximizeArray(arr1, arr2, 5);
foreach
(
int
val
in
result)
Console.Write(val +
" "
);
Console.WriteLine();
}
}
public
class
PriorityQueue<T>
{
private
List<T> data;
private
readonly
Comparison<T> comparison;
public
PriorityQueue(Comparison<T> comparison)
{
data =
new
List<T>();
this
.comparison = comparison;
}
public
void
Enqueue(T item)
{
data.Add(item);
int
ci = data.Count - 1;
while
(ci > 0)
{
int
pi = (ci - 1) / 2;
if
(comparison(data[ci], data[pi]) >= 0)
break
;
T tmp = data[ci]; data[ci] = data[pi]; data[pi] = tmp;
ci = pi;
}
}
public
T Dequeue()
{
if
(Count == 0)
throw
new
InvalidOperationException(
"PriorityQueue is empty"
);
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 && comparison(data[rc], data[ci]) < 0) ci = rc;
if
(comparison(data[pi], data[ci]) <= 0)
break
;
T tmp = data[pi]; data[pi] = data[ci]; data[ci] = tmp;
pi = ci;
}
return
frontItem;
}
public
T Peek()
{
if
(Count == 0)
throw
new
InvalidOperationException(
"PriorityQueue is empty"
);
return
data[0];
}
public
int
Count {
get
{
return
data.Count; } }
public
override
string
ToString()
{
string
s =
""
;
for
(
int
i = 0; i < data.Count; ++i)
s += data[i].ToString() +
" "
;
s +=
"count = "
+ data.Count;
return
s;
}
public
bool
IsConsistent()
{
if
(data.Count == 0)
return
true
;
int
li = data.Count - 1;
for
(
int
pi = 0; pi < data.Count; ++pi)
{
int
lci = 2 * pi + 1;
int
rci = 2 * pi + 2;
if
(lci <= li && comparison(data[pi], data[lci]) > 0)
return
false
;
if
(rci <= li && comparison(data[pi], data[rci]) > 0)
return
false
;
}
return
true
;
}
}