力扣2382. 删除操作后的最大子段和
题目

题目解析及思路
题目要求找到每次删除一个元素的最大字段和
因为删除不好做,可以转删除为添加,用并查集维护当前子段和
两部分合并(两个并查集),三部分求和(两个并查集和一个元素)
代码
cpp
class Solution {
public:
vector<long long> maximumSegmentSum(vector<int>& nums, vector<int>& removeQueries) {
int n = nums.size();
//把数组看做一条链,最右边n的位置有一个虚拟头节点
int p[n+1];
iota(p,p+n+1,0);
long long sum[n+1];
memset(sum, 0, sizeof(sum));
vector<long long> ans(n);
function<int(int)> find = [&](int x) -> int {
return p[x] == x ? x : p[x] = find(p[x]);
};
//反向操作
for(int i=n-1;i>0;i--){
int x = removeQueries[i];
int fa = find(x+1);
p[x] = fa;
sum[fa] += sum[x] + nums[x];
ans[i-1] = max(ans[i],sum[fa]);
}
return ans;
}
};