题解:CF2121F Yamakasi
一个非常经典的模型:长为
我们转化一下,做个前缀和,现在求有多少组
那么维护
auto work = [&]() {
map<i64, int> f;
f[0]++;
i64 ans = 0;
for (int i = 0; i < n; i++) {
if (f.contains(pre[i + 1] - s)) {
ans += f[pre[i + 1] - s];
}
f[pre[i + 1]]++;
}
return ans;
};
这道题多了一个限定,不仅要和为
要求最大值正好等于
void solve() {
int n, x;
i64 s;
cin >> n >> s >> x;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<i64> pre(n + 1);
for (int i = 0; i < n; i++) {
pre[i + 1] = pre[i] + a[i];
}
auto work = [&](int x) {
map<i64, int> f;
f[0]++;
i64 ans = 0;
for (int i = 0; i < n; i++) {
if (a[i] > x) { // 如果大于 x,就把之前的扔掉重新开始计数
f.clear();
}
if (f.contains(pre[i + 1] - s)) {
ans += f[pre[i + 1] - s];
}
f[pre[i + 1]]++;
}
return ans;
};
cout << work(x) - work(x - 1) << "\n";
}