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\) 变 ...
随机推荐
- SpringCloud之Config
1.背景 在前的学习中,我们几乎解决了springCloud的所有常规应用,但是大家有没有想过这样一个问题: 是使用微服务后,有非常多的application.yml文件,每个模块都有一个,实际开发中 ...
- Django常用 命令
Django常用 命令: 安装: pip install django 指定版本 pip3 install django==2.0 新建项目: django-admin.py startproject ...
- 【C#】 堆和栈
前言 本文主要是讲解C#语言在内存中堆.栈的使用情况,使读者能更好的理解值类型.引用类型以及线程栈.托管堆. 首先感谢原文作者:Matthew Cochran 为我们带来了一篇非常好的文章,并配以大量 ...
- java基本数据类型和包装类之间的转换(装箱,拆箱)
1.装箱:把基本数据类型转换成包装类 1.1自动装箱 int t1=2; Integer t2 =t1; 1.2手动装箱 Integer t3 = new Integer(t1); 2.拆箱:把包装类 ...
- 如何将excel中纵向的转换成横向保证格式不变,
先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下
- tomcat配置启动不了
关于ideatomcat配置问题 1.第一步配置tomcat启动器 2.配置启动的网址 3.配置启动器的启动 ---更多java学习,请见本人小博客:https://zhangjzm.gitee.io ...
- 记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析
一:背景 1. 讲故事 这是6月中旬一位朋友加wx求助dump的故事,他的程序 cpu爆高UI卡死,问如何解决,截图如下: 在拿到这个dump后,我发现这是一个关于机械臂的MRS程序,哈哈,在机械臂这 ...
- [编译] 10、kconfig 入门指导教程
目录 前言 1. 安装 kconfig 2. 克隆一个 demo 3. 运行 kconfig 4. 源码解析 4.1 选择题目设计模板 4.2 填空题目设计模板 4.3 判断题目设计模板 5. 产物解 ...
- 【Python机器学习实战】决策树与集成学习(六)——集成学习(4)XGBoost原理篇
XGBoost是陈天奇等人开发的一个开源项目,前文提到XGBoost是GBDT的一种提升和变异形式,其本质上还是一个GBDT,但力争将GBDT的性能发挥到极致,因此这里的X指代的"Extre ...
- ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
前提概要 在开发过程中在使用多线程进行并行处理一些事情的时候,大部分场景在处理多线程并行执行任务的时候,可以通过List添加Future来获取执行结果,有时候我们是不需要获取任务的执行结果的,方便后面 ...