codeforces 761 D. Dasha and Very Difficult Problem(二分+贪心)

题目链接:http://codeforces.com/contest/761/problem/D

题意:给出一个长度为n的a序列和p序列,求任意一个b序列使得c[i]=b[i]-a[i],使得c序列的大小顺序和p序列一样。

p序列给出的的是1~n不重复的数。还有给出的l和r是b序列的大小范围

显然为了要使结果存在尽量使b取得最接近r,所以可以先按p排序一下,从大到小处理b,二分l,r的值使得每次的b尽量

大。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 1e5 + 10;
int a[M] , p[M] , b[M];
struct TnT {
    int A , P , num;
}T[M];
bool cmp(TnT x , TnT y) {
    return x.P > y.P;
}
int binsearch(int l , int r , int num , int now) {
    int mid = (l + r) >> 1;
    while(l <= r) {
        mid = (l + r) >> 1;
        if(mid - now >= num) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    return r;
}
int main() {
    int n , l , r;
    cin >> n >> l >> r;
    for(int i = 0 ; i < n ; i++) {
        cin >> a[i];
    }
    for(int i = 0 ; i < n ; i++) {
        cin >> p[i];
        T[i].A = a[i] , T[i].P = p[i] , T[i].num = i;
    }
    sort(T , T + n , cmp);
    int flag = 0;

    for(int i = 0 ; i < n ; i++) {
        if(i == 0) {
            b[T[i].num] = r;
        }
        else {
            int gg = b[T[i - 1].num] - a[T[i - 1].num];
            int pos = binsearch(l , r , gg , a[T[i].num]);
            if(pos == l - 1) {
                flag = 1;
                break;
            }
            b[T[i].num] = pos;
        }
    }
    if(flag) {
        cout << - 1 << endl;
    }
    else {
        for(int i = 0 ; i < n ; i++) {
            cout << b[i] << ' ';
        }
        cout << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6679426.html