P7444-「EZEC-7」猜排列【dp】
正题
题目链接:https://www.luogu.com.cn/problem/P7444
题目大意
一个长度为\(n\)的排列,已知每个\(c_i\)表示那个排列中\(mex\)为\(i\)的区间个数。求满足条件的排列个数
\(1\leq n\leq 5\times 10^5,c_i\geq 0,\sum_{i=1}^nc_i=\frac{n(n+1)}{2}-1\)
解题思路
考虑一个朴素的\(dp\),设\(f_{i,l,r}\)表示加入了\(1\sim i\),然后最大区间是\([l,r]\)时的方案。
那么每次插入一个数\(i\)的时候如果\(c_i=0\)那么它一定在目前的最大区间里,否则需要扩展到区间外,每次有往左或者往右扩展。
不难发现对于\(1\sim i\)扩展到\(l\),那么\(r\)是固定的,所以我们可以直接用\(f_{i,l}\)来表示状态,但是这样还是\(O(n^2)\)的,其实状态数比较少的,因为对于一个\(i\)来说需要扩展的\(a_i\)都是一些倍数形的。
其实总状态数不会超过\(\sum_{i=1}^n\sqrt{a_i}\),因为上限很难到,所以用个\(vector\)记录一下状态就能够过了
code
#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;
}
P7444-「EZEC-7」猜排列【dp】的更多相关文章
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- LOJ 2292 「THUSC 2016」成绩单——区间DP
题目:https://loj.ac/problem/2292 直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况. 自己想了一番枚举 max-min 的最大限制,然后在该基础上 ...
- 「算法笔记」状压 DP
一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...
- 「学习笔记」斜率优化dp
目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动 ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- 洛谷比赛 「EZEC」 Round 4
洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...
- LOJ #2540. 「PKUWC 2018」随机算法(概率dp)
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)
题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...
随机推荐
- 【java虚拟机】jvm调优原则
转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...
- 初识javaScript(慕课网学习笔记)
js输出 window.alert() 警告框 document.write() 写到HTML文档中 innerHTML 写到HTML元素 console.log() 写到浏览器的控制台 <!D ...
- 并发编程之:synchronized
大家好,我是小黑,一个在互联网苟且偷生的农民工. 之前的文章中跟大家分享了关于Java中线程的一些概念和基本的使用方法,比如如何在Java中启动一个线程,生产者消费者模式等,以及如果要保证并发情况下多 ...
- playwright-python 截图、录制视频、录制接口(二)
截图 fullPage为True时,截取全屏,默认为False clip截取特定部分的图片,{"x": float, "y": float, "wid ...
- 基于Linux系统的MariaDB数据库的安装配置
数据库是指长期存储在计算机内.有组织的和可共享的数据集合.表是数据库存储数据的基本单位,一个表由若干个字段组成 MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 G ...
- 你的 JVM 基础“大厦”稳健吗?
[从 1 开始学 JVM 系列] JVM 对于每位 Java 语言编程者来说无疑是"重中之重",尽管我们每天都在与它打交道,却很少来审视它.了解它,慢慢地,它成为了我们" ...
- jvm学习笔记:程序计数器
程序计数器(PC Register) The Java Virtual Machine can support many threads of execution at once (JLS §17). ...
- 斐波那契数(Java)
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) = F(n ...
- call、apply、bind三者比较
var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...
- [第二篇]——Docker 架构之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker 架构 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统.比如官方镜像 ubuntu:16.04 就包含了完整的一 ...