题目:
在和樱子一起出去玩后,幸介非常害怕,因为他忘记了他的编程作业。老师给了他一个包含n个整数的数组a,并让他计算数组a中不重叠的美丽区间的数量,所谓美丽区间是指区间[l,r]满足al+al+1+⋯+ar−1+ar=0的情况。
对于一个固定的数组a,你的任务是计算出最多有多少个不重叠的美丽区间。
思路:
看到区间和就想到前缀和,看到数区间对的数量那可能涉及双指针。那么我们先计算前缀和,对于每个前缀和,我们总希望在后面找到一个最近的相等的前缀和,这样这个区间和就是零。
实现方式就是遍历前缀和,不断将遍历到的前缀和加入集合中,如果出现重复元素,那么ans加一,清空集合,因为这样就可以避免得到重叠区间。
一开始没注意用了unordered_set超时了,我发誓以后都用set和map。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
int n;
cin >> n;
vector<ll> a(n);
for(int i = 0; i < n; ++i){
cin >> a[i];
}
set<ll> st;
st.insert(0);
ll prefix_sum = 0;
int ans = 0;
for(int i = 0; i < n; ++i){
prefix_sum += a[i];
if(st.find(prefix_sum) != st.end()){
ans++;
st.clear();
st.insert(0);
prefix_sum = 0;
}
else{
st.insert(prefix_sum);
}
}
cout << ans << '\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while(t--){
solve();
}
return 0;
}