codeforce761D

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值