CF1591F Non-equal Neighbours
题面:this
solution:
容斥神仙题qwq
考虑全集-补集,此时补集就是一些集合的并,可使用容斥
设至少
直接求不好求,考虑转化:
有
此时自然而然的可以定义出:
所以此时可以设计出一个状态转移方程:
时间复杂度为
此时可以发现:
所以可以把第二维压成
接着观察一下式子,发现
接下来关键的一步,就是回到
因此,考虑拆
可以发现一个性质:
对于一个下标
此时维护一个单调栈即可在
code:
#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+10,mod=998244353; int n,a[N]; int stk[N],top; int f[N][2],s[N][2]; signed main(){ std::ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; f[0][0]=s[0][0]=1,f[0][1]=s[0][1]=0; for(int i=1;i<=n;i++){ while(a[stk[top]]>=a[i]&&top)top--; stk[++top]=i; for(int j=0;j<2;j++){ f[i][j]=((top==1?0:f[stk[top-1]][j])+(s[i-1][j^1]-(top==1?0:s[stk[top-1]-1][j^1])+mod)*a[i])%mod; s[i][j]=(s[i-1][j]+f[i][j])%mod; } } cout<<(f[n][0]-f[n][1]+mod)*((n&1)?(-1+mod):1)%mod; return 0; }
本文作者:Little_corn
本文链接:https://www.cnblogs.com/little-corn/p/18157453
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步