mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
122 lines
3.0 KiB
C++
122 lines
3.0 KiB
C++
|
#include <bits/stdc++.h>
|
||
|
using namespace std;
|
||
|
typedef long long LL;
|
||
|
typedef pair<int, int> PII;
|
||
|
typedef vector<int> VI;
|
||
|
typedef vector<PII> VP;
|
||
|
|
||
|
class Solution {
|
||
|
static const int MAXN = 2000 + 10;
|
||
|
int a[MAXN], n, m;
|
||
|
LL count00(LL ret = 0) {
|
||
|
map<VI, VP> mp;
|
||
|
for (int i = 1; i < n; i += 2) {
|
||
|
VI pt; int sum = 0;
|
||
|
for (int j = i; j + 1 < n; ++j) {
|
||
|
pt.push_back(a[j]);
|
||
|
if (j & 1) {
|
||
|
if (a[i - 1] + sum + a[j + 1] >= m) {
|
||
|
mp[pt].push_back(PII(a[i - 1], a[j + 1]));
|
||
|
}
|
||
|
} else sum += a[j];
|
||
|
if (sum >= m) break;
|
||
|
}
|
||
|
}
|
||
|
for (auto &e: mp) {
|
||
|
VP &y = e.second, x;
|
||
|
int sum = m;
|
||
|
for (size_t i = 1; i < e.first.size(); i += 2) sum -= e.first[i];
|
||
|
for (auto &v: y) {
|
||
|
int L = v.first, R = v.second;
|
||
|
v.first = max(1, sum - R);
|
||
|
v.second = min(L, sum - 1);
|
||
|
if (v.first <= v.second) x.push_back(v);
|
||
|
}
|
||
|
if (x.empty()) continue;
|
||
|
sort(x.begin(), x.end());
|
||
|
int l = x[0].first, r = x[0].second;
|
||
|
for (size_t i = 0; i < x.size(); ++i) {
|
||
|
if (x[i].first <= r) r = max(r, x[i].second);
|
||
|
else {
|
||
|
ret += r - l + 1;
|
||
|
l = x[i].first;
|
||
|
r = x[i].second;
|
||
|
}
|
||
|
}
|
||
|
ret += r - l + 1;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
LL count10(LL ret = 0) {
|
||
|
map<VI, int> mp;
|
||
|
for (int i = 1; i < n; i += 2) {
|
||
|
VI pt; int sum = 0;
|
||
|
for (int j = i + 1; j < n; ++j) {
|
||
|
pt.push_back(a[j]);
|
||
|
if (~j & 1) {
|
||
|
sum += a[j];
|
||
|
if (sum >= m) {
|
||
|
sum -= a[j];
|
||
|
pt.pop_back();
|
||
|
pt.push_back(m - sum);
|
||
|
mp[pt] = max(mp[pt], a[i]);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (auto &e: mp) ret += e.second;
|
||
|
return ret;
|
||
|
}
|
||
|
LL count11(LL ret = 0) {
|
||
|
map<VI, VP> mp;
|
||
|
for (int i = 2; i < n; i += 2) {
|
||
|
VI pt; int sum = 0;
|
||
|
for (int j = i; j + 1 < n; ++j) {
|
||
|
pt.push_back(a[j]);
|
||
|
if (~j & 1) {
|
||
|
sum += a[j];
|
||
|
if (sum == m) mp[pt].push_back(PII(a[i - 1], a[j + 1]));
|
||
|
else if (sum > m) break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (auto &e: mp) {
|
||
|
VP &y = e.second;
|
||
|
sort(y.begin(), y.end());
|
||
|
for (int i = y.size() - 2; i >= 0; --i) {
|
||
|
y[i].second = max(y[i].second, y[i + 1].second);
|
||
|
}
|
||
|
for (size_t i = 0; i < y.size(); ++i) {
|
||
|
int extra = i ? y[i].first - y[i - 1].first : y[i].first;
|
||
|
ret += 1ll * extra * y[i].second;
|
||
|
}
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
public:
|
||
|
void run() {
|
||
|
scanf("%d%d", &n, &m);
|
||
|
for (int i = 0; i < n; ++i) scanf("%d", a + i);
|
||
|
LL ret = count00() + count11();
|
||
|
ret += count10();
|
||
|
if (n % 2 == 0) a[n++] = 0;
|
||
|
reverse(a, a + n);
|
||
|
ret += count10();
|
||
|
for (int i = 0; i < n; i += 2) if (a[i] >= m && m) {
|
||
|
++ret; break;
|
||
|
}
|
||
|
if (m == 0) {
|
||
|
ret = 0;
|
||
|
for (int i = 1; i < n; i += 2) ret = max(ret, (LL)a[i]);
|
||
|
}
|
||
|
printf("%lld\n", ret);
|
||
|
}
|
||
|
} sol;
|
||
|
|
||
|
int main() {
|
||
|
int T; scanf("%d", &T);
|
||
|
for (int cas = 1; cas <= T; ++cas) sol.run();
|
||
|
return 0;
|
||
|
}
|