题意:给定a数组,和一个代表c数组相对大小的p数组。c=b-a . a,b∈[l,r] .p∈[1,n] .数组长度都为n。若b数组存在,求b数组。
思路:按照p数组的大小排序,最大那个C=b-a,b的最大值为赋r .因为已经排序,可以让c之间相差1,总是去维护每个b可能的最大值,最大值都小于l无解。最大值超过r,将其赋为r。
#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,ox3f,sizeof(a))
#define ll long long
#define FOR(i,n) for(int i=0;i<n;i++)
using namespace std;
const int INF = ( 2e9 ) + 2;
const int maxn = 1e5+10;
struct P
{
int a,b,c,p;
int id;
}d[maxn];
bool cmp(P a,P b)
{
return a.p>b.p;
}
bool cmp2(P a,P b)
{
return a.id<b.id;
}
int main()
{
int n,l,r;
scanf("%d%d%d",&n,&l,&r);
for(int i=0;i<n;i++)
{
scanf("%d",&d[i].a);
d[i].id=i;
}
for(int i=0;i<n;i++)
scanf("%d",&d[i].p);
sort(d,d+n,cmp);
int flag=1;
d[0].c=r-d[0].a;
d[0].b=r;
for(int i=1;i<n;i++)
{
int t=d[i-1].c-1+d[i].a; //当前b的最大值
if(t<l)flag=0;
if(t>r)t=r;
d[i].b=t;
d[i].c=d[i].b-d[i].a;
}
sort(d,d+n,cmp2);
if(flag)
for(int i=0;i<n;i++)
printf("%d ",d[i].b);
else
printf("-1");
printf("\n");
}