codeforce 761D
看到codeforce 的d题居然会有这样的水题我增加了一点信心(下次cf一定要再拼拼看,现在自己可以在cf上去拼的有算法的题就是dp、二分、搜索、贪心这些的)
思路:
比较简单,一遍a过。r和最大的那个数控制最大的p,再从大往小遍历,这道题可以用的套路是map的使用。
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
typedef long long ll;
#define maxn 100010
int n;
ll l,r;
int book;
using namespace std;
int main()
{
ll a[maxn],b[maxn],c[maxn];
ll d[maxn];
pair<ll,ll> p[maxn];
map<ll, int> m;
map<ll,int>:: iterator mp;
while (scanf ("%d %lld %lld",&n,&l,&r)!=EOF){
book=1;
int i;
for (i=1;i<=n;i++){
scanf ("%lld",&a[i]);
p[i].second = a[i];
}
for (i=1;i<=n;i++)
{scanf ("%lld",&c[i]);
p[i].first = c[i];
m[c[i]] = i ;
}
sort (p , p + n+1);
d[n] = r - p[n].second ;
ll res= d[n];
for (int i = n; i>=1 ; i-- ){
d[i] = res;
if (d[i] + p[i].second > r ) {ll minus= (d[i] +p[i].second) -r;
d[i]-= minus;
res-= minus;
}
else if (d[i]+ p[i].second <l){
book= -1;
break;
}
//printf("%lld\n",d[i]);
res--;
}
if (book ==-1) printf("-1\n");
else {
for (i=n;i>=1;i--){
d[i] += p[i].second;
}
int i =1;
for (mp= m.begin();mp!= m.end(); mp++){
b[(*mp).second] =d[i++];
}
for (i=1;i<n;i++)
printf("%lld ",b[i] );
printf("%lld\n",b[i]);
}
}
return 0;
}