首页 > 其他分享 >CF1437F Emotional Fishermen 题解

CF1437F Emotional Fishermen 题解

时间:2024-01-16 10:27:46浏览次数:16  
标签:le 题解 最大值 个数 渔民 2a lim Fishermen Emotional

题意:

有 \((n\le 5000)\) 个渔民,每个渔民钓了一条重 \(a_i\) 的鱼,渔民按任意顺序展示他们的鱼。

若当前渔民的鱼的重量为 \(x\),之前展示过的鱼的最大重量 \(y\)。

一个排列满足条件当且仅当对于每个 \(x\),满足 \(2y\le x\) 或 \(2x\le y\)。

问有多少个排列满足条件,对 \(998244353\) 取模

分析:

做法一:

显然对于一个数列,重要的只有最大值。

所以首先从小到大排序,使用 dp。

记 \(f_{i,j}\) 表示当前排列填了 \(j\) 个数,其中最大值为 \(a_{i}\) 的方案数。记 \(lim_{i}=j\) 表示最大的 \(j\) 使得 \(2a_{j}\le a_{i}\)。

转移也很简单:

  • 第 \(j\) 个数大于等于前面的最大值的 \(2\) 倍。直接枚举之前的最大值 \(a_{k}\),那么 \(f_{k,j-1} \rightarrow f_{i,j}(2a_{k} \le a_{i})\)。

  • 第 \(j\) 个数小于等于前面的最大值的 \(\frac{1}{2}\)。前面已经用了 \(j-2\) 个数,有 \(lim_{i}\) 个数可以成为第 \(j\) 个数,因此有 \((j-2-lim_{i})\) 种。那么 \(f_{i,j-1} \times (j-2-lim_{i}) \rightarrow f_{i,j}\)。

前者很好使用前缀和优化,因此时间复杂度为 \(O(n^2)\)。

做法二:

容易发现排序后如果 \(2a_{n-1}>a_{n}\),那么答案必定为 \(0\)。

因此不妨记 \(f_{i}\) 表示当前最大值为 \(a_i\),序列里填了 \(lim_{i}+1\) 个数的方案数。

考虑枚举上一个最大值 \(j\),注意需要满足 \(2a_{j}\le a_{i}\),由于 \(lim_{j}+1\) 个位置已经固定了,将 \(i\) 放在第一个空位上,那么只剩 \(n-lim_{j}-2\) 个空位,将 \(lim_{i}-lim_{j}-1\) 个数填进去。因此转移为

\[f_{i}=\sum_{j=0}^{lim_{i}}f_{j} \times P_{n-lim_{j}-2}^{lim_{i}-lim_{j}-1} \]

利用前缀和优化,时间复杂度 \(O(n \log n)\)。

标签:le,题解,最大值,个数,渔民,2a,lim,Fishermen,Emotional
From: https://www.cnblogs.com/xcs123/p/17967026

相关文章

  • ABC336 F Rotation Puzzle 题解
    QuestionABC336FRotationPuzzle给出一个\(H\timesW\)的矩阵,里面填有数字,有一种操作选定一个\((x,y)\)交换\((i+x,j+y)\)和\((H-i+x,W-j+y)\)对于每一个\(1\lei\leH-1,1\lej\leW-1\)问,是否能经过\(20\)次以内的操作使得,最后的矩形变成\((i,j)=((i-1)\t......
  • P1002题解
    思路设\(dp_{i,j}\)表示第\(i\)行\(j\)列卒走到这里有多少种方式。卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j}=dp_{i-1,j}+dp_{i,j-1}\)。如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为\(0\)。如......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......
  • P10058题解
    怎么前三题都是思维题啊。思路总共有三个操作,先不看翻转操作。如果你右移\(x\)位之后,左移\(x\)位,那么就相当于没有操作。这个应该是很好理解的。我们根据上面的结论,能得出以下代码。if(op==">"){cin>>x;f+=x;}elseif(op=="<"){......
  • CF1409D题解
    思路因为数据较大,使用字符串读入。考虑使用贪心。先统计出当前数码之和。然后从低位往高位枚举,看一下把当前位改了之后是否小于等于\(s\)。如果小于的话,则统计出把当前位往后所有位都改为0,\(k\)为多少,求出的\(k\)就是最优解。说明一下为什么要从低位往高位枚举,这样如果成......
  • AT_arc060_c题解
    纪念模拟考考挂。思路首先二分查找出当前点往后走最远能去哪个点,当前点为\(i\),记最远能去的那个点为\(nt_i\)。考虑建一棵树,将\(nt_i\)设为\(i\)点的父节点。暴力的话直接从当前点往上找,找到目标节点看几次就好了。但显然是过不了的。考虑使用倍增优化。设\(g_{i,j}......
  • 1.15模拟赛 T2题解
    简要题意多重背包但是乘法思路暴力就直接跑背包考虑乘法能否变为加法,可以找到模数的原根,将每个数映射一下,这样乘法就变成了加法,可以直接\(\text{bitset}\)优化,但是暴力这样做还是过不了于是我们考虑二进制分组优化背包,这样复杂度貌似就对了?code#pragmaGCCoptimize("Ofast......
  • border设置渐变boder-radius不生效问题解决方案
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"c......
  • 【题解】gym103743 (2022 JSCPC)
    A.PENTAKILL!考虑直接模拟,规则就是一个人将其他人全部都击杀,并且中间没有重复击杀。code:#include<bits/stdc++.h>usingnamespacestd;map<string,vector<string>>st;intn;stringa,b;intmain(){cin>>n;for(inti=1;i<=n;++i){ci......
  • 题解「JOI 2014 Final」IOI 馒头
    传送门。题意有\(n\)个物品,\(m\)个背包。第\(i\)个物品的价值是\(P_i\),第\(j\)个背包可以装\(C_i\)个物品,但会消耗\(E_i\)的价值。背包不能重复买,问最多可以获得多少价值。分析首先一个简单的贪心,我们在购买背包后塞入物品,一定时从大往小塞,也就是说,我们可以先对......