SRM540 Div1 Easy - ImportantSequence

問題

長さn+1で各要素が自然数であるような数列aと長さnの文字列opがあった
opの各文字は '+' か '-' である
op[i] = '+' のとき) b[i] = a[i]+a[i+1]
op[i] = '-' のとき) b[i] = a[i]-a[i+1]
という風にして作った長さnの数列bとopが与えられる
元の数列aとしてあり得るものの個数を求めよ
ただし答えが無限に存在する場合は-1を返す

1 <= n <= 50
|b[i]| <= 10^9
答えがint型に収まることは保証される

解法

opが全て '-' のとき明らかに答えは無限になる
以下そうでないときを考える

aの要素を1つだけ決めると他のn個の要素も全て一意に定まる
a[0]=1としたときのaをx、a[0]=2としたときのaをyとし、d[i]=y[i]-x[i]とすると、d[i]は-1か1となる
d[i]=1ならa[i]を1以上にするにはa[0]を-x[i]+2以上にする必要がある
d[i]=-1ならa[i]を1以上にするにはa[0]をx[i]以下にする必要がある
これらの条件からa[0]の下限lと上限rが求められ、答えr-l+1が求められる

実装

答えは大丈夫でもxとかyがintの範囲を超えることはあり得るから基本的にlonglongで計算していって最後にintで返す
(例えばb = {-10^9, -10^9, -10^9}, op = "---" のとき x[3] = 3*10^9 + 1)
正答率めっちゃ低い理由はここなのか?
答えが-1になるケースを考えるときに '-' が続くと数字がいくらでも大きくなることはわかりそうだけど
どの辺が罠なのかよくわからなかった

class ImportantSequence {
public:
	int getCount(vector<int> b, string op) {
		if (!count(all(op), '+')) return -1;
		ll n = b.size(), x[55] = {}, y[55] = {}, d[55] = {};
		x[0] = 1, y[0] = 2;
		rep(i,n) {
			if (op[i]=='+') x[i+1] = b[i]-x[i], y[i+1] = b[i]-y[i];
			else x[i+1] = x[i]-b[i], y[i+1] = y[i]-b[i];
			d[i+1] = y[i+1] - x[i+1];
		}
		ll l = 0, r = 1ll<<60;
		reps(i,1,n+1) {
			if (d[i]==1) chmax(l, -x[i]+1);
			else chmin(r, x[i]-1);
		}
		return (int)max(0ll, r-l+1);
	}
};