题面

CF1437F Emotional Fishermen

给 \(n\) 个数的序列 \(a_i\),求有多少种 \(n\) 个数的排列 \(p_i\),使得

\[\frac{a_{p_i}}{\max_{j=1}^{i-1} a_{p_j}}\notin \left(\frac 12, 2\right)
\]

答案膜 \(998244353\)。

数据范围:\(2\le n\le 5000\)。


题解

您会很高兴地发现当前 \(a_{p_i}\) 大于前面最大值的总次数不会超过 \(\log\) 次,可惜这没用。

但是考虑这个前缀最大值的序列,却可以发现这东西改变序列便是不同的。

将 \(a_i\) 排序 ,考虑用 \(a_i\) 填满一个长度为 \(n\) 的空位序列。

设 \(f_i\) 表示当前最大值是 \(a_i\) 的填充方案数,\(lim_i\) 表示最大的 \(j\) 满足 \(2a_j\le a_i\)。

先把这个最大值填当前的第一个空位。

由于最大值只会增大,对于所有 \(2a_j\le a_i\) 必定满足 \(2a_j\) 小于未来的最大值,所以可以先把 \(2a_j\le a_i\) 的 未使用的 都填在最大值后面的空位上(不需要连续),顺序重要。

为什么不需要多设一维表示当前放的个数呢?因为 \(f_i\) 放的个数必定是 \(1+lim_i\),这个 \(1\) 指的是自己。

所以转移方程是:

\[f_i=\sum_{j=0}^{lim_i} f_j\cdot A(n-2-lim_j,lim_i-lim_j-1)
\]

这里 \(n-2-lim_j\) 是总空位数减去 \(f_j\) 用的空位数减去当前最大值 \(1\) 个,\(lim_i-lim_j-1\) 是 \(2a_t\le a_i\) 的未使用的 \(a_t\) 个数。

时间复杂度 \(\Theta(n^2)\),空间复杂度 \(\Theta(n)\)。


代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define bg begin()
#define ed end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),i##E=(b);i<i##E;i++)
#define L(i,a,b) for(int i=(b)-1,i##E=(a)-1;i>i##E;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f; //Data
const int N=5000;
int n,a[N],f[N+1],lim[N+1]; //Math
const int mod=998244353;
void fmod(int&x){x+=mod&x>>31;}
int Pow(int a,int x){
int res=1; for(;x;x>>=1,a=1ll*a*a%mod)
if(x&1) res=1ll*res*a%mod; return res;
}
int fac[N+1],ifac[N+1];
void math_init(){
fac[0]=1; R(i,1,n+1) fac[i]=1ll*fac[i-1]*i%mod;
ifac[n]=Pow(fac[n],mod-2);
L(i,0,n) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
}
int A(int u,int v){
if(u<0||v<0||v>u) return 0;
return 1ll*fac[u]*ifac[u-v]%mod;
} //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n,math_init();
R(i,0,n) cin>>a[i]; sort(a,a+n);
R(i,0,n){
int l=-1,r=i+1;
while(r-l>1){
int mid=(l+r)>>1;
if(a[mid]*2>a[i]) r=mid;
else l=mid;
}
lim[i+1]=r;
}
f[0]=1,lim[0]=-1;
R(i,1,n+1)R(j,0,lim[i]+1)
fmod(f[i]+=1ll*f[j]*A(n-2-lim[j],lim[i]-lim[j]-1)%mod-mod);
// R(i,0,n+1) cout<<f[i]<<" ";cout<<'\n';
if(lim[n]==n-1) cout<<f[n]<<'\n';
else cout<<0<<'\n';
return 0;
}

祝大家学习愉快!

题解-CF1437F Emotional Fishermen的更多相关文章

  1. Codeforces 1437F Emotional Fishermen(思维,dp)

    题意 给出数列\(a_i\),求排列\(p_i\)的数量满足 \[\frac{a_{p_i}}{max_{j=1}^{i-1}a_{p_j}} \notin (\frac{1}{2},2) \] 思路 ...

  2. Educational Codeforces Round 97 (Rated for Div. 2)

    补了一场Edu round. A : Marketing Scheme 水题 #include <cstdio> #include <algorithm> typedef lo ...

  3. csp-s模拟47 Emotional Flutter,Endless Fantasy题解

    题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...

  4. 题解 Emotional Flutter

    传送门 因为一个等号挂掉了10pts 发现每个黑色段一定对应了一段不可行的出发区间 检查是否存在所有黑色段的并集的补集即可 具体来说,我们对于每个黑色段计算出一个(有的是两个)区间 \([l, r]\ ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图:  一.互斥锁(mutex)  锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...

  2. windows下命令行设置静态IP

    windows 10 预览版出现无法设置静态IP的bug,只能通过命令行进行设置,开启powershell,然后执行下列的命令即可 下面的"以太网 3" 为你设置的网卡的网卡名称, ...

  3. 《Machine Learning in Action》—— 小朋友,快来玩啊,决策树呦

    <Machine Learning in Action>-- 小朋友,快来玩啊,决策树呦 在上篇文章中,<Machine Learning in Action>-- Taoye ...

  4. 每天一个linux命令之top

    每天一个linux命令之top 转  https://www.linuxprobe.com/chapter-02.html 在图2-6中,top命令执行结果的前5行为系统整体的统计信息,其所代表的含义 ...

  5. jsp跳转不成功,服务器也不报错,登录页面点击登录没反应,代码如下,请韭菜园子的工友给予指导!

    登录后.. 根本跳不到这个检查页面.. 这个登录成功页面也就无从谈起了!

  6. 通过Folx的排序功能来设置下载任务的优先级

    当我们使用Folx进行多任务下载时,突然遇到要下载一个紧急文件的情况,该如何让这个紧急文件的下载任务排在优先的位置?当然,用户也可以先暂停所有的下载任务,仅开启紧急文件的下载任务. 但这种方式需要用户 ...

  7. CorelDRAW常用工具之渐变工具

    我们在进行宣传单页或者LOGO等等各种平面设计时,颜色的使用是极为重要的一方面.有些新手可能还不知道怎么填充多种颜色的渐变,有的背景色不止2个颜色渐变,而是由多种颜色调成的. 我们在画布上画两个图形, ...

  8. Mac升级资料丢失怎么办?EasyRecovery能恢复嘛?

    随着越来越多的用户选择性能更高的mac笔记本来工作,一般情况下,为了保证用户有一个很好的使用体验,Mac系统会在一定的时间内进行系统的更新,弥补前一个版本的不足.结果就有一些用户反应Mac升级后,电脑 ...

  9. 使用Camtasia 让照片变身动态视频

    视觉化影像已经慢慢渗入我们平日的生活了,很多人已经慢慢地从单纯的文字记录,发展到使用照片记录生活,而视频化的记录也随着智能手机的普及而迅速发展起来.对于一些曾经使用照片记录的瞬间,我们也可以将其变身为 ...

  10. thinkPHP 无法加载控制器:Hello

    出现这种问题的情况下要看看: (1).控制器的名称是否写对,控制器的命名规范(别忘下class) 控制器的命名规则1.必须采用大驼峰的命名规则2.必须以Controller.class.php来结尾I ...