题解:P10385 [蓝桥杯 2024 省 B] 拔河
Description
给定一个序列,要求从中找到两个不相交的子段,使得两个子段元素和的差值尽可能小。
序列长度不超过
Analysis
从大到小枚举
再枚举
这是一个插入、lower_bound 问题,可以用 set 维护。
时间复杂度:每次右端点进行
Code
#include <bits/stdc++.h>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
using ll = long long;
int n;
std::cin >> n;
std::vector<int> a(n);
for (auto &i : a) std::cin >> i;
std::set<ll> s;
ll ans = LONG_LONG_MAX;
for (int r = n - 2; r >= 0; --r) {
ll sum = 0;
for (int l = r + 1; l < n; ++l) s.insert(sum += a[l]);
sum = 0;
for (int l = r; l >= 0; --l) {
sum += a[l];
auto p = s.lower_bound(sum);
if (p != s.end()) {
ans = std::min(ans, *p - sum);
}
if (p != s.begin()) {
ans = std::min(ans, sum - *std::prev(p));
}
}
}
std::cout << ans << '\n';
}