class Solution {
public:
static inline int calculate(int up, int down) {
if (up == 0 && down == 0) return 1;
if (up > down) ++up;
else ++down;
return up * (up + 1) / 2 + down * (down + 1) / 2;
}
int candy(vector<int>& ratings) {
int result = 0;
int overlap = 0;
bool isDown = false;
int up = 0;
int down = 0;
int prev = ratings[0];
for (int i = 1; i < ratings.size(); ++i) {
int curr = ratings[i];
if (prev < curr) {
if (isDown) {
result += calculate(up, down);
up = down = 0;
isDown = false;
++overlap;
}
++up;
} else if (prev > curr) {
++down;
isDown = true;
} else {
result += calculate(up, down);
isDown = false;
up = down = 0;
}
prev = curr;
}
result += calculate(up, down);
return result - overlap;
}
};