1700\贪心
大意
an.bn.cn三个数组
an bn限定范围l-r
cn不限范围 规定每个数的大小次序
规定bn-an=cn;
给出 an cn 求bn
贪心做法:
先找到cn中最大的数 令cn=an+r,即令cnmax对应的bn=r 尽可能的拉高cn数组的上限,增加cn的选择空间
再找cn中第二大的数 这个数要满足小于最大的数,且小于r-an,且大于l-an;若不满足则判-1 能满足则继续
最后可求出cn
第一次wa :输出了cn。。应该再加上an
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#define fi for(int i=1;i<=n;i++)
#define fi2 for(int i=0;i<n;i++)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int INF=0x3f3f3f3f;
const int MAX=2e5+10;
int a[MAX],c[MAX];
set<pair<int,int>> b;
int main(){
int n,l,r;
cin>>n>>l>>r;
fi{
cin>>a[i];
}
fi{
int x;
cin>>x;
b.insert(make_pair(x,i));
}
// sort(b,b+n);
auto p=b.end();
p--;
c[p->second]=r-a[p->second];
for(int i=n-1;i>0;i--)
{ p--;
// cout<<p->first<<' '<<p->second<<endl;
auto p2=++p;
p--;
c[p->second]=min(r-a[p->second],c[p2->second]-1);
if(c[p->second]<l-a[p->second]){
cout<<"-1";return 0;
}
}
fi{
cout<<c[i]+a[i]<<' ';
}
}