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