cf-Dasha and Very Difficult Problem
题意:
已知ci = bi - ai,p是从1到n的n个数字的序列,表示c中的大小顺序。先给出n表示序列长度,l,r表示序列a,b的范围。给出a序列和p序列,求出一个可能的b序列,没有输出-1
思路:
bi = ai + ci
我们求出b序列,如果b序列在l,r的给定范围内,则符合要求,如果越界,则不符合要求。为了使用这一特性,我们要求范围最小化的b序列,即求得的b序列是满足题意的最小b序列。由于p表示ci的大小顺序。 bi又与ci成线性关系。所以要使b最小,则c最小,根据题意,c序列最小即等于p序列。
所以bi = ai + pi
求得b序列中的最大值和最小值来确定b的范围,与l,r确定的范围比较即可
题目: 点击打开链接#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+7;
const int inf =0x3f3f3f3f;
int n,m,l,r;
int a[MAXN],p[MAXN],b[MAXN];
int main()
{
int i;
scanf("%d%d%d",&n,&l,&r);
for(i=0; i<n; ++i)scanf("%d",&a[i]);
int MAX=0,MIN=inf;
for(i=0; i<n; ++i)
{
scanf("%d",&p[i]);
b[i]=a[i]+p[i];
MAX=max(MAX,b[i]);
MIN=min(MIN,b[i]);
}
if(MAX-MIN+1>r-l+1)puts("-1");
else
{
int x;
if(MIN<l)x=l-MIN;
else x=r-MAX;
for(i=0; i<n; ++i)
{
b[i]+=x;
}
for(i=0; i<n; ++i)printf(i==n-1?"%d\n":"%d ",b[i]);//满足,输出并换行;否则输出不换行
}
return 0;
}