题目
官方没看懂
参考
思路:固定反括号,枚举正括号。详见代码,代码有注释。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
typedef long long ll;
int n;
ll a[maxn];
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%lld", &a[i]);
}
ll ans = 0;
for(int r = 1; r < n; r += 2) {// 枚举右括号
ll inter = 0;// 需要的右括号的数量
ll balance = 0;// 实际消耗的右括号的数量
ll minBalance = a[r];// 最少需要的左括号数量
for(int l = r - 1; l >= 0; l -= 2) {// 枚举左括号
if (l < r - 1) {
inter -= a[l+1];
minBalance += a[l+1];
}
minBalance -= a[l];
ll R = a[r] - inter - 1;// 剩余的右括号上限,统一-1处理
ll tmp = min(R, a[r] - balance) - max(0LL, minBalance) + 1LL;// 统一+1处理
ans += max(0ll, tmp);
inter += a[l];
balance = max(balance, inter);
if(a[r] - inter < 0) break;
}
}
printf("%lld",ans);
}