[ARC115E] LEQ and NEQ 题解
我这场打的 VP,结果 E 思考的时间比 A 还少。。
但是我觉得我能想出这道题还是很有意义的,写篇题解记录一下。
首先应该都不难想到动态规划吧?我们先使用暴力 DP:设
:此时 有两种取值范围,分别是 以及 。对于后者的范围,我们发现 怎么取都不会影响到 的取值,我们设 ,因此这一部分的 。对于 ,我们就要考虑到 的限制。根据容斥原理,我们用 减去 的情况就行了,于是得到下面的转移:
:这个时候无论 取 的什么值都有可能受到 的影响。不过思路还是用上面的容斥,我们得到:
知道这些之后,我们要得到的答案就是:
因此,若要在题目所给的数据范围限制下快速得到答案,我们必须想办法快速处理出
0x01
对于
根据
0x02
对于
化简最多也就能变成这样,内层的求和还是不能省去。本题有价值的思路来了:我们想象一下
于是
我们再继续展开,去考虑
但是极限数据不允许我们暴力递归。我们令
结合上述推理,我们可以使用单调栈求出
不难发现可以通过将
最后注意一下各种取模就行了,代码也比较短小:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
const int MOD=998244353;
int n,a[MAXN];
long long dp[MAXN],sum[MAXN],num[MAXN];
int stk[MAXN],cnt,l[MAXN];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
while(cnt&&a[stk[cnt]]>a[i]) cnt--;
l[i]=stk[cnt],stk[++cnt]=i;
}
dp[1]=a[1]%MOD,sum[1]=a[1]%MOD;
for(int i=2;i<=n;i++)
{
if((i-1)&1) dp[i]=sum[i-1]+num[l[i]]-sum[l[i]]-num[i-1]+MOD*2,dp[i]%=MOD;
else dp[i]=num[i-1]+sum[l[i]]-num[l[i]]-sum[i-1]+MOD*2,dp[i]%=MOD;
dp[i]*=a[i],dp[i]%=MOD;
int g=((i-l[i]-1)&1)?-1:1;
if(!l[i]) dp[i]+=g*a[i],dp[i]+=MOD,dp[i]%=MOD;
else dp[i]+=dp[l[i]]*(a[i]-1)%MOD*g,dp[i]+=MOD,dp[i]%=MOD;
if(i&1) sum[i]=sum[i-2]+dp[i],num[i]=num[i-1];
else num[i]=num[i-2]+dp[i],sum[i]=sum[i-1];
sum[i]%=MOD,num[i]%=MOD;
}
cout<<dp[n];
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析