Codeforces 394 D. Dasha and Very Difficult Problem 贪心

来源:互联网 发布:四层横移编程 编辑:程序博客网 时间:2024/06/03 21:10

题意:给定a数组,和一个代表c数组相对大小的p数组。c=b-a .  a,b∈[l,r] .p∈[1,n] .数组长度都为n。若b数组存在,求b数组。

思路:按照p数组的大小排序,最大那个C=b-a,b的最大值为赋r .因为已经排序,可以让c之间相差1,总是去维护每个b可能的最大值,最大值都小于l无解。最大值超过r,将其赋为r。

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,ox3f,sizeof(a))#define ll long long#define FOR(i,n) for(int i=0;i<n;i++)using namespace std;const int INF = ( 2e9 ) + 2;const int maxn = 1e5+10;struct P{int a,b,c,p;int id;}d[maxn];bool cmp(P a,P b){return a.p>b.p;}bool cmp2(P a,P b){return a.id<b.id;}int main(){int n,l,r;scanf("%d%d%d",&n,&l,&r);for(int i=0;i<n;i++){scanf("%d",&d[i].a);d[i].id=i;}for(int i=0;i<n;i++)scanf("%d",&d[i].p);sort(d,d+n,cmp);int flag=1;d[0].c=r-d[0].a;d[0].b=r;for(int i=1;i<n;i++){int t=d[i-1].c-1+d[i].a; //当前b的最大值 if(t<l)flag=0;if(t>r)t=r;d[i].b=t;d[i].c=d[i].b-d[i].a;}sort(d,d+n,cmp2);if(flag)for(int i=0;i<n;i++)printf("%d ",d[i].b);elseprintf("-1");printf("\n");}

阅读全文
0 0