(File IO): input:fett.in output:fett.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet
题目描述
从前有一条神奇的项链,为什么说它神奇呢?因为它有两个性质:
- 神奇的项链可以拉成一条线,线上依次是 个珠子,每个珠子有一个能量值 ;
- 除了第一个和最后一个珠子,其他珠子都满足
。
由于这条项链很长,我们只能知道其两端珠子的能量值。并且我们知道每个珠子的 是多少。请聪明的你求出这 个珠子的能量值分别是多少。
输入
第一行三个整数
表示珠子个数
,第一个珠子和第
个珠子的能量值。
第二行
个整数,表示第
个珠子到第
个珠子的
。
输出
输出仅一行,
个整数,表示
到
个这
个珠子各自的能量值
。
请放心,数据保证对于任意珠子满足
样例输入
Sample Input 1:
4 1 4
0 0
Sample Input 2:
10 1 22
1 2 -3 5 1 4 2 -1
样例输出
Sample Output 1:
1 2 3 4
Sample Output 2:
1 14 25 32 45 48 49 42 31 22
数据范围限制
%的数据
。
%的数据
,所有数据(包括计算中的)不超过
。
%的数据
,
。
解题思路
二分答案
通过
,我们可以推出
也就是说知道E2就知道全部
二分
如果
和输入进来的一样,就输出
代码
扫描二维码关注公众号,回复:
9358912 查看本文章
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
long long n,b,d[500010],a[500010];
long long l=-2147483647,r=-l,k,mid;
int main(){
freopen("fett.in","r",stdin);
freopen("fett.out","w",stdout);
scanf("%lld%lld%lld",&n,&a[1],&k);
for(int i=2;i<n;i++)
scanf("%lld",&d[i]);
while(l<=r){
mid=(l+r)/2;
a[2]=mid;
for(long long i=2;i<n;i++){
a[i+1]=(a[i]-d[i])*2-a[i-1];
}
if(a[n]==k)
{
for(long long i=1;i<=n;i++)
printf("%lld ",a[i]);
return 0;
}
if(a[n]>k)
r=mid;
else
l=mid;
}
return 0;
}