题目大意:有多个骰子。每个骰子可以转出1-d[i]内的所有数字。
现在给你总和A,问你每个骰子不能够转出的数字有哪几个。
结合一下样例应该就懂了。
思路:
我的思路是这样子的。
对于一个骰子d[i];
他所能够转出的数值是1-d[i];
所以其他的骰子应该给他提供a-d[i],a-1之间的数,不能提供的就是答案。
其他骰子可以提供的数为n-1,sum[n]-d[i];
区间合并一下,求区间内的数,反向减法一下,就OK了
注意A和sum都是要long long的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int d[210000];
long long sum[210000];
int b[210000];
int main()
{
int n;
long long a;
while(~scanf("%d%lld",&n,&a))
{
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i]);
sum[i]=sum[i-1]+d[i];
}
if(n==1)
printf("%d\n",d[1]-1);
else{
for(int i=1;i<=n;i++)
{
long long r=a-1;
long long l=a-d[i];
long long ll=n-1;
long long rr=sum[n]-d[i];
l=max(l,ll);
r=min(r,rr);
b[i]=d[i]-r+l-1;
}
for(int i=1;i<n;i++)
printf("%d ",b[i]);
printf("%d\n",b[n]);
}
}
}