【CodeForces - 761D 】Dasha and Very Difficult Problem (构造,思维)

版权声明:欢迎学习我的博客,希望ACM的发展越来越好~ https://blog.csdn.net/qq_41289920/article/details/82656703

题干:

Dasha logged into the system and began to solve problems. One of them is as follows:

Given two sequences a and b of length n each you need to write a sequence c of length n, the i-th element of which is calculated as follows: ci = bi - ai.

About sequences a and b we know that their elements are in the range from l to r. More formally, elements satisfy the following conditions: l ≤ ai ≤ r and l ≤ bi ≤ r. About sequence c we know that all its elements are distinct.

Dasha wrote a solution to that problem quickly, but checking her work on the standard test was not so easy. Due to an error in the test system only the sequence a and the compressed sequence of the sequence c were known from that test.

Let's give the definition to a compressed sequence. A compressed sequence of sequence c of length n is a sequence p of length n, so that pi equals to the number of integers which are less than or equal to ci in the sequence c. For example, for the sequence c = [250, 200, 300, 100, 50] the compressed sequence will be p = [4, 3, 5, 2, 1]. Pay attention that in c all integers are distinct. Consequently, the compressed sequence contains all integers from 1 to n inclusively.

Help Dasha to find any sequence b for which the calculated compressed sequence of sequence c is correct.

Input

The first line contains three integers nlr (1 ≤ n ≤ 105, 1 ≤ l ≤ r ≤ 109) — the length of the sequence and boundaries of the segment where the elements of sequences a and b are.

The next line contains n integers a1,  a2,  ...,  an (l ≤ ai ≤ r) — the elements of the sequence a.

The next line contains n distinct integers p1,  p2,  ...,  pn (1 ≤ pi ≤ n) — the compressed sequence of the sequence c.

Output

If there is no the suitable sequence b, then in the only line print "-1".

Otherwise, in the only line print n integers — the elements of any suitable sequence b.

Examples

Input

5 1 5
1 1 1 1 1
3 1 5 4 2

Output

3 1 5 4 2 

Input

4 2 9
3 4 8 9
3 2 1 4

Output

2 2 2 9 

Input

6 1 5
1 1 1 1 1 1
2 3 5 4 1 6

Output

-1

Note

Sequence b which was found in the second sample is suitable, because calculated sequence c = [2 - 3, 2 - 4, 2 - 8, 9 - 9] = [ - 1,  - 2,  - 6, 0] (note that ci = bi - ai) has compressed sequence equals to p = [3, 2, 1, 4].

解题报告: 

    按照题意,先按照pos排序(我是从大到小排序,也可以从小到大),然后构造出最大的bi,显然,让bi==r是最好的(也就得到了c的最大值),这样我们就找到了右边界,然后一个一个让c的那个值--,每次  --  都 判断一下算出的bi是否出边界了(因为我们只要用c和a了,那就可以求出b)b=a+c,(ps:我好想是写反了,写成了b=a-c,所以一直让tmp++了,其实应该是b=a+c  然后 tmp--)。判断左边界,就是如果算出一个bi已经比 l 要小了,那么肯定就无解了,,(因为之前的每一步都是让bi在合法状态下取了最大值,结果到你这一步 算出来bi<l了,肯定是凉凉了),所以输出-1就好了。

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 1e5 + 5;
ll n;
ll l,r;
ll a[MAX],pos[MAX],ans[MAX];
struct Node {
	ll pos,id;
} node[MAX];

bool cmp(Node a,Node b) {
	return a.pos > b.pos;
}
int main()
{
	scanf("%lld",&n);
	scanf("%lld%lld",&l,&r);
	for(int i = 1; i<=n; i++) scanf("%lld",a+i);
	for(int i = 1; i<=n; i++) {
		scanf("%lld",&node[i].pos);node[i].id = i;
	}
//	if(n > r - l +1) {
//		printf("-1\n");return 0;
//	}
	sort(node+1,node+n+1,cmp);
	ll tmp = a[node[1].id]-r,flag=0;
	ans[node[1].id] = r;
	for(int i = 2; i<=n; i++) {
		tmp++;
		while(a[node[i].id] - tmp >r) tmp++;
		ans[node[i].id] = a[node[i].id] - tmp;
		if(a[node[i].id]-tmp<l) flag = 1;
	}
	if(flag == 1) {
		printf("-1\n");return 0;
	}
	printf("%lld",ans[1]);
	for(int i = 2; i<=n; i++) printf(" %lld",ans[i]);
	return 0 ;
}

总结:

   1WA,直接让tmp--了,没有让他属于合法范围内,就是这一句while(a[node[i].id] - tmp >r) tmp++;。这里解释一下为什么这个右边界就可以,而左边界就只要出界就输出-1了。因为我们能找到合法解肯定要找合法解,我们出了右边界,那就找一个刚好不出右边界的呗。但是左边界就不同了,因为在我们这种写法下,tmp只能越来越大,才能满足c离散化以后的那个p数组、、(因为我们这里tmp实际上是-c了)

   2WA,因为没有看清条件,误认为b是distinct的,但是其实是c是distinct的、、、所以加了

//	if(n > r - l +1) {
//		printf("-1\n");return 0;
//	}

这个判断,,是不对的。

贴一个很简洁的代码:

Preparing... 1/10

注意掌握vis数组这样的应用,就不需要开结构体了。 

猜你喜欢

转载自blog.csdn.net/qq_41289920/article/details/82656703