1次式にして値の範囲を決める。
数式だけ見ると簡単なんだけど、Div1が阿鼻叫喚になるような問題だった。
最初のサンプルだと
"+-+"
3, -1, 7
式を A + B - C + D とすると、
(A + B) = 3
(B - C) = -1
(C + D) = 7
これを
B = 3 - A
C = 4 - A
D = -3 + A
とすると A の範囲が決められる。
どうやればいいのか一見して思い浮かばなかったけど、符号の反転に注意して頭から計算すればいいだけだった。
class ImportantSequence { public: int getCount(vector <int> B_, string O) { const int size = B_.size(); vector<lli> B; for (int i = 0; i < (int)size; ++i) { B.push_back(B_[i]); } const lli inf = 1LL << 60; int sign = 0; lli n = 0; lli pA = 1; lli nA = inf; for (int i = 0; i < (int)size; ++i) { if (O[i] == '+') { n = B[i] - n; sign ^= 1; } else { n = -B[i] + n; } if (sign) { nA = min(nA, n - 1); } else { pA = max(pA, -n + 1); } } lli ret = nA - pA + 1LL; if (ret < 0) return 0; if (ret < INT_MAX) return ret; return -1; } };