A. Leha and Function

time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Leha like all kinds of strange things. Recently he liked the function F(n, k). Consider all possible k-element subsets of the set [1, 2, ..., n]. For subset find minimal element in it. F(n, k) — mathematical expectation of the minimal element among all k-element subsets.

But only function does not interest him. He wants to do interesting things with it. Mom brought him two arrays A and B, each consists of mintegers. For all i, j such that 1 ≤ i, j ≤ m the condition Ai ≥ Bj holds. Help Leha rearrange the numbers in the array A so that the sum  is maximally possible, where A' is already rearranged array.

Input

First line of input data contains single integer m (1 ≤ m ≤ 2·105) — length of arrays A and B.

Next line contains m integers a1, a2, ..., am (1 ≤ ai ≤ 109) — array A.

Next line contains m integers b1, b2, ..., bm (1 ≤ bi ≤ 109) — array B.

Output

Output m integers a'1, a'2, ..., a'm — array A' which is permutation of the array A.

Examples
input
5
7 3 5 3 4
2 1 3 2 3
output
4 7 3 5 3
input
7
4 6 5 8 8 2 6
2 1 2 2 1 1 2
output
2 6 4 5 8 8 6

解题说明:题意 是F(n,k) 表示从 1 ~ n 里选出 k 个数,每次选出的 k 个数的贡献为 k 个数里最小哪个数,把 a 数组重新拍下序,使得 F(ai,bi) 的和最大。 推导下会发现 F(n,k) = C(n,k) * 1 + C(n - 1,k) * 2….+C(n - (n - k),k) k , n 相同时 k 越小 ,F(n,k) 越大,让 较大 的 n 和 较小的 k 配对,最优。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;


const int MAX = 2e5 + 10;
typedef long long LL;
struct node 
{
	int a, o;
}s[MAX], st[MAX];

bool cmp(node i, node j) { return i.a > j.a; }
bool cnp(node i, node j) { return i.a < j.a; }
bool cpp(node i, node j) { return i.o < j.o; }
int main()
{
	int m; scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d", &st[i].a);
		st[i].o = i;
	}
	for (int i = 0; i < m; i++)
	{
		scanf("%d", &s[i].a);
		s[i].o = i;
	}
	sort(st, st + m, cmp);
	sort(s, s + m, cnp);
	for (int i = 0; i < m; i++)
	{
		st[i].o = s[i].o;
	}
	sort(st, st + m, cpp);
	for (int i = 0; i < m; i++)
	{
		printf("%d ", st[i].a);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值