河南住房城乡建设厅官方网站免费广告投放平台
力扣2382. 删除操作后的最大子段和
题目
题目解析及思路
题目要求找到每次删除一个元素的最大字段和
因为删除不好做,可以转删除为添加,用并查集维护当前子段和
两部分合并(两个并查集),三部分求和(两个并查集和一个元素)
代码
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;}
};