AtCoder Regular Contest 115 E. LEQ and NEQ(容斥 单调栈优化dp)

文章讲述了如何利用容斥原理和单调栈优化算法解决一个关于序列划分的问题,目标是在给定条件下计算满足特定相邻数不相等的序列组合数,最后答案对998244353取模。
题目

n(n<=5e5)个数,第i个数ai(1<=ai<=1e9)

构造一个序列b,要求bi∈[1,ai],且b[i]不等于b[i+1]

求方案数,答案对998244353取模

思路来源

洛谷题解Xu_brezza

一模一样的cf题:

Codeforces Round 759 (Div. 2, based on Technocup 2022 Elimination Round 3) F. Non-equal Neighbours

题解

首先肯定是容斥,假设出现了一对冲突的就叫有一个坏点,

那么,答案=没有冲突的-至少一个冲突的+至少两个冲突的...

出现了一个坏点,就认为是合并减少了一个数,

所以最后如果减少了k个数,就认为序列被拆成了n-k段,且每段内的数字相同

dp[i][j]表示前i个数被划分成了j段的方案数,

其中每段内的数字是相同的,也就是从[1,这一段的最小值]中取

1. 朴素转移即枚举最后一段在哪,补上这最后一段的贡献,对应了这一个区间的最小值

dp[i][j]+=\sum_{k=0}^{i-1}dp[k][j-1]*min_{x=k+1}^i{a_{x}}

复杂度O(n^3)

2. 注意到,第二维对容斥系数的贡献,只有第二维的奇偶性,所以可以改写为

dp[i][j\&1]+=\sum_{k=0}^{i-1}dp[k][j\&1\bigoplus 1]*min_{x=k+1}^i{a_{x}}

前缀和分别维护第二维为奇数/为偶数的和,

复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值