做过的题-最大字段和的一个模板题

题目链接:StarryCoding | 奕歌科技

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
const int N = 1e5 + 9;
int a[N];		//对应动物的类型
int w[N];		//对应动物的体重
ll s[N];	//偏移量前缀和(释放魔法后)
int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		for (int i = 1; i <= n; i++)
			cin >> w[i];
		for (int i = 1; i <= n; i++)
			s[i] = s[i - 1] + (a[i] ? -1 : 1) * w[i];		//偏移量前缀和,如果类型为1则为-1(如果施加魔法会变成老鼠,要减去)
		ll zuichu=0;								//时间魔法前的体重
		for (int i = 1; i <= n; i++)
			zuichu += a[i] * w[i];
		ll mi = 0, pianyi = 0;			//mi=最小的s[j], 0<=j<i。如果发现无论怎样释放魔法,都会比释放前小,那么pianyi=0;
		for (int i = 1; i <= n; i++)
		{
			pianyi = max(pianyi, s[i]-mi);	//应该是求最大的(s[r]-s[l-1]),即求数值最大的偏移量区间,可以遍历,这时r是确定的,然后找最小的s[l-1]即可,但是l-1<r;
			mi = min(mi, s[i]);		//mi赋值必须在后面才能确保<i;
		}
		cout << zuichu + pianyi << "\n";
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值