P7444-「EZEC-7」猜排列【dp】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P7444


1|1题目大意

一个长度为n的排列,已知每个ci表示那个排列中mexi的区间个数。求满足条件的排列个数

1n5×105,ci0,i=1nci=n(n+1)21


1|2解题思路

考虑一个朴素的dp,设fi,l,r表示加入了1i,然后最大区间是[l,r]时的方案。

那么每次插入一个数i的时候如果ci=0那么它一定在目前的最大区间里,否则需要扩展到区间外,每次有往左或者往右扩展。

不难发现对于1i扩展到l,那么r是固定的,所以我们可以直接用fi,l来表示状态,但是这样还是O(n2)的,其实状态数比较少的,因为对于一个i来说需要扩展的ai都是一些倍数形的。

其实总状态数不会超过i=1nai,因为上限很难到,所以用个vector记录一下状态就能够过了


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const ll N=5e5+10,P=998244353; ll n,a[N],f[2][N],ed[2][N],vis[N]; vector<int> v[2]; signed main() { scanf("%lld",&n); for(ll i=0;i<n;i++) scanf("%lld",&a[i]); ll Ans=0,s=0; for(ll i=1;i<=n;i++){ ll l=i-1,r=n-i; if(l*(l+1)+r*(r+1)==a[0]*2) s=i,Ans++; } if(!Ans)return puts("0")&0; f[0][s]=1;ed[0][s]=s;v[0].push_back(s); for(ll i=1;i<n-1;i++){ v[i&1].clear(); for(ll p=0;p<v[~i&1].size();p++){ ll l=v[~i&1][p],r=ed[~i&1][l]; if(vis[l]==i)continue;vis[l]=i; if(!a[i]){ if(r-l-i<0)continue; (f[i&1][l]+=f[~i&1][l]*(r-l-i+1)%P)%=P; ed[i&1][l]=r;v[i&1].push_back(l); } else{ ll lk=l,rk=n-r+1; if(a[i]%lk==0){ ll nr=r+a[i]/lk; (f[i&1][l]+=f[~i&1][l])%=P; ed[i&1][l]=nr;v[i&1].push_back(l); } if(a[i]%rk==0){ ll nl=l-a[i]/rk; (f[i&1][nl]+=f[~i&1][l])%=P; ed[i&1][nl]=r;v[i&1].push_back(nl); } } } for(ll p=0;p<v[~i&1].size();p++) f[~i&1][v[~i&1][p]]=0; } ll ans=0; for(ll i=1;i<=n;i++) (ans+=f[(n-2)&1][i])%=P; printf("%lld\n",ans*Ans%P); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14578729.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(196)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示