n l r
然后b序列
然后给出rank
构造出a序列
显然先要根据rank拍一下序
然后 也就是二分一个数a a-num[i]>num[i-1]-ans[i-1];
求最小的a
判断这个序列能不能存在
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<set> #include<string> using namespace std; typedef long long LL; #define inf 10000000000000 #define MAXN 100010 struct node { int val; int ran; int ind; }num[MAXN]; bool cmp(node a,node b) { return a.ran<b.ran; } LL ans[MAXN]; int main() { int n,l,r; while(scanf("%d%d%d",&n,&l,&r)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&num[i].val); for(int i=0;i<n;i++) { scanf("%d",&num[i].ran); num[i].ind=i; } sort(num,num+n,cmp); ans[num[0].ind]=l; int ok=0; for(int i=1;i<n;i++) { LL a=inf; LL le=l; LL ri=inf; while(le<=ri) { LL mid=(le+ri)>>1; if(mid-num[i].val>ans[num[i-1].ind]-num[i-1].val) a=min(mid,a),ri=mid-1; else le=mid+1; } // printf("%lld ",a); ans[num[i].ind]=a; if(a>r) ok=1; } if(ok==1) printf("-1 "); else { for(int i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d ",ans[n-1]); } } return 0; }