Leetcode周赛295记录

这篇博客介绍了如何运用单调栈解决一个关于计算巫师总力量的问题。通过计算前缀和和后缀和,利用单调栈维护每个巫师为结尾的子数组中最左边的小于当前元素的值,从而求得每个巫师的贡献,并最终得到总力量。文章详细展示了算法实现过程,包括代码和关键步骤的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该场比赛反应出基础不牢靠的现象
T3T3T3-将式子等价变形,用乘代替除()避免下取整和浮点数导致的精度误差

T4-巫师的总力量和

在这里插入图片描述

  • 考虑以每个巫师为末尾的子数组。需要在左侧查找第一个小于的数
  • 使用单调栈(忘记了)
  • 注意该取模的地方才取模
class Solution {
	typedef long long ll;
	const long long mod = (ll) (1e9 + 7); 
public:
	ll getrangesum(ll pre[],int i,int j)
	{
		ll pre_; if(i == 0) pre_ = 0;else pre_ = pre[i - 1];
		return (pre[j]- pre_  );
	}
    int totalStrength(vector<int>& strength) {
        stack<array<ll,3>> s;
		//计算后缀
		ll suf[strength.size()];
		//计算前缀和
		ll pre[strength.size()];
		for(int i = 0;i<strength.size();i++)
		{
			ll pre_;
			if(i == 0) pre_ = 0;else pre_=suf[i-1];
			suf[i] = (pre_ + ((ll)i + 1) * (ll)strength[i]) ;
			if(i == 0) pre_ = 0;else pre_ = pre[i-1];
			pre[i] = (pre_ + (ll)strength[i]);
			//cout << pre[i] << endl;
		}
		ll dp[strength.size()];
		//对每个点使用单调栈维护
		for(int i = 0;i<strength.size();i++)
		{
			while(!s.empty() && s.top()[1] >= strength[i]) s.pop();
			if(s.empty()) 
			{
				s.push({(ll)i,strength[i],((ll)i+1)*(ll)strength[i]});
				dp[i] = (suf[i] % mod * strength[i] % mod) % mod;
			}
			else 
			{
				array<ll,3> temp = s.top();
				ll j = temp[0];
				ll newsum = (i - j) * (ll)strength[i] + temp[2];
				ll sum_j = temp[2];
				ll sum_j_1_i = getrangesum(pre,j+1,i);
				ll suf_j_1_i = getrangesum(suf,j+1,i);
				dp[i] = ((dp[j] + (sum_j % mod )*(sum_j_1_i % mod))  % mod + ((suf_j_1_i % mod  - (j + 1) * (sum_j_1_i % mod) % mod)%mod * (ll)strength[i] % mod) % mod) % mod;
				s.push({(ll)i,(ll)strength[i],newsum});
			}
           // cout << dp[i] << endl;
		}
		long long ans = 0;
		for(int i = 0;i<strength.size();i++) ans = (ans + dp[i]) % mod;
		return (int)(ans % mod);  
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值