题目链接:点击这里

题目大意:
给 nnn 个正整数数的序列 aia_iai​,求有多少种 nnn 个数的排列 apia_{p_i}api​​,满足 apimaxj=1i−1apj∉(12,2)\frac{a_{p_i}}{max^{i-1}_{j=1}a_{p_j}}\notin (\frac1 2,2)maxj=1i−1​apj​​api​​​∈/​(21​,2) 结果对 998244353998244353998244353 取余

题目分析:
因为跟 aia_iai​ 的大小关系有关所以首先对序列排序,然后在一个长度为 nnn 的空序列上添数
设 dp[i]dp[i]dp[i] 表示当前最大值是 aia_iai​ 的方案数,此题结果就是 dp[n]dp[n]dp[n] ; pos[i]pos[i]pos[i] 表示满足 ai>=2aja_i>=2a_jai​>=2aj​ 的最大的 jjj
因为对 aaa 序列排序了,所以其前缀最大值一定是不下降的,故 pos[i]pos[i]pos[i] 可以使用单调栈来快速维护出来(pos[i]pos[i]pos[i]显然也是不下降的),所以就可以先把没用过的数天再最大值后面的空位上

转移方程是: dp[i]=∑j=0i−1dp[j]∗An−2−posjposi−posj−1dp[i]= \sum^{i-1}_{j=0} dp[j]*A^{pos_i-pos_j-1}_{n-2-pos_j}dp[i]=j=0∑i−1​dp[j]∗An−2−posj​posi​−posj​−1​
解释一下方程:第 iii 个数显然会用 pos[i]+1pos[i]+1pos[i]+1 个位置,即前面符合 ai>=2aja_i>=2a_jai​>=2aj​ 的 jjj 个加其本身, n−2−posjn-2-pos_jn−2−posj​ 就是用所有的 nnn 个位置减去 dp[j]dp[j]dp[j] 用的 pos[j]+1pos[j]+1pos[j]+1 个位置再减去当前最大值要占的位置, posi−posj−1pos_i-pos_j-1posi​−posj​−1 是指当前可以放 pos[i]pos[i]pos[i] 个位置,在放 dp[j]dp[j]dp[j] 时已经放了 pos[j]+1pos[j]+1pos[j]+1 个位置,所以是 dp[j]dp[j]dp[j] 这个状态的值加上从 n−2−posjn-2-pos_jn−2−posj​ 个位置里选 posi−posj−1pos_i-pos_j-1posi​−posj​−1 个位置的排列数量
时间复杂度为 O(n2)O(n^2)O(n2)
具体细节见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll read()
{ll res = 0,flag = 1;char ch = getchar();while(ch<'0' || ch>'9'){if(ch == '-') flag = -1;ch = getchar();}while(ch>='0' && ch<='9'){res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';ch = getchar();}return res*flag;
}
const int maxn = 5e3+5;
const int mod = 998244353;
const double pi = acos(-1);
const double eps = 1e-8;
ll n,a[maxn],fac[maxn],inv[maxn],pos[maxn],dp[maxn];
ll qpow(ll a,ll b)
{ll res = 1;while(b){if(b&1) res = res*a%mod;b >>= 1;a = a*a%mod;}return res;
}
ll A(ll n,ll m)
{return fac[n]*inv[n-m]%mod;
}int main()
{n = read();fac[0] = 1;for(int i = 1;i <= n;i++){a[i] = read();fac[i] = fac[i-1]*i%mod;}inv[n] = qpow(fac[n],mod-2);for(int i = n-1;i;i--)inv[i] = inv[i+1]*(i+1)%mod;inv[0] = dp[0] = 1;sort(a+1,a+n+1);int tail = 0;for(int i = 1;i <= n;i++){while(tail < n && a[i] >= 2*a[tail+1]) tail++;pos[i] = tail;}dp[0] = 1;pos[0] = -1;for(int i = 1;i <= n;i++)for(int j = 0;j <= pos[i];j++)dp[i] = (dp[i]+dp[j]*A(n-2-pos[j],pos[i]-pos[j]-1)%mod)%mod;if(pos[n] == n-1) printf("%lld\n",dp[n]);else puts("0");return 0;
}

CodeForces 1437F Emotional Fishermen(计数dp)相关推荐

  1. UVA 10564 计数DP

    也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞...不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下, ...

  2. Sumsets POJ - 2229(计数dp)

    题意: 给一个数,是集合的总数和,集合元素只能为2的次幂数,问这样的集合有多少? 题目: Farmer John commanded his cows to search for different ...

  3. CSPS 2019 Day2 T1 Emiya 家今天的饭(容斥 + 计数 dp)

    Description 给定一个 n×mn \times mn×m 的矩阵,每一行最多选一个数,每一列可以选若干个数,但是每一列选的数不能超总数的一半.求有多少个不同的方案数. Solution 容斥 ...

  4. CodeForces - 1312E Array Shrinking(区间dp)(通俗易懂)

    CodeForces - 1312E Array Shrinking(区间dp) 题目链接: 没做出来,看了一下别人的题解,才A掉.但网上没发现一篇讲得比较易懂的题解,所以就准备写一篇再加上我自己的理 ...

  5. dp2:线性dp、区间dp、计数dp.

    线性dp   动态规划时间复杂度分析,状态数目与状态转移次数相乘. 数字三角形 数字三角形 以集合的观点考虑dp问题. #include<iostream> #include<cst ...

  6. 【CodeForces 1253C --- Sweets Eating】DP

    [CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...

  7. 组合计数 ---- Codeforces 737C Div2 C. Moamen and XOR [多阶段决策计数dp]

    题目链接 题目大意: 有nnn个数.每次数范围是[0,2k]∣k∈[0,3e5][0,2^k]|k\in[0,3e5][0,2k]∣k∈[0,3e5] 问你有多少种情况这nnn个数的与大于等于异或 首 ...

  8. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,包含a,b,c,?a,b,c,?a,b,c,?四种字符,其中???可以变成为a,b,ca,b,ca,b,c的任意一种,让你求abca ...

  9. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  10. 【CodeForces - 1105C】Ayoub and Lost Array(线性计数dp)

    题干: Ayoub had an array aa of integers of size nn and this array had two interesting properties: All ...

最新文章

  1. python下划线变量的含义
  2. 面试题 17.14. 最小K个数
  3. HTML静态网页---标签
  4. 【算法导论】第7章快速排序
  5. java堆缓冲区,Java NIO之Buffer(缓冲区)
  6. 乐华娱乐前训练生黄智博卖口罩诈骗案宣判:获刑三年三个月
  7. hihocoder 1866 XOR
  8. 基于3D技术的机器视觉解决方案
  9. 2021-01-21安装FireFox插件FireBug和FirePath时遇到得坑(windows10)
  10. 从0开始学心电信号处理(1)——心电信号的读取
  11. Linux环境下向github上传代码(生成token、生成本地密钥)
  12. 打印机后台程序没有运行怎么办
  13. 蚂蚁金服副 CTO胡喜:从 BASIC 到 basic ,蚂蚁金服十五年技术架构演进之路
  14. Unity 关于镜面反射和投影阴影实现
  15. bios设置识别linux硬盘,linux下如何查看硬盘插在主板那个SATA接口上?梅捷主板SY-A77M3+ bios设置 咋设置啊...
  16. 在线招聘江湖:老、中、新三代平台对垒
  17. [Halcon资料] 学习资料链接
  18. 计算机图形学 第四章 光栅图形学
  19. arduino花盆含水量_Arduino教程┃模拟土壤湿度传感器的介绍
  20. 正则 提取 url 中 的 用户名 和 密码

热门文章

  1. 三年高级开发,六年成为架构师,到CTO我用了12年
  2. CPU使用率查看方法
  3. 程序员之间的幽默段子,句句都是经典
  4. unbuntu 安装node
  5. 构建自己的Linux 之三 初步完善(提供网络功能等)
  6. 牙疼不是病疼起来真要命!教你几个止疼小偏方
  7. U盘文件数据恢复工具如何使用
  8. 2011端午节搞笑短信大全
  9. 七个技巧!Godaddy域名安全指数提高N倍
  10. C# 微信支付请求分账