点此看题面

大致题意: 有\(n\)个数字,定义一个数的排名为不小于它的数的个数。现要随机将其中\(k\)个数乘\(2\),求对于每个数有多少种方案使其排名不变。

分类讨论

对于这种题目,我们可以分类讨论一下,假设当前考虑第\(i\)个数的答案。

当\(a_i\)不被修改时,因为原先就\(\ge a_i\)的数不可能在修改后\(<a_i\),所以我们就可以知道:

  • 原先就\(\ge a_i\)的数可以随意修改。
  • 原先\(<a_i\)的数如果修改后\(\ge a_i\)就不可以修改。

如果我们将原序列排序,设\(t1\)满足\(2a_{t1}<a_i\le 2a_{t1+1}\),那么不可以修改的数就有\(i-t1\)个,而剩下的\(n-(i-t1)\)个数可以任意修改,即方案数为:

\[C_{n-(i-t1)}^k
\]

当\(a_i\)被修改时,因为原先就\(<a_i\)的数在修改后必然依旧\(<a_i\),所以我们就可以知道:

  • 原先就\(<a_i\)的数可以随意修改。
  • 原先就\(\ge2a_i\)的数可以随意修改。
  • 原先\(\ge a_i\)且\(<2a_i\)的数必须修改。

如果我们将原序列排序,设\(t2\)满足\(a_{t2}<2a_i\le a_{t2+1}\),那么必须修改的数就有\(t2-i+1\)个(注意\(a_i\)必须修改),而剩下的\(n-(t2-i+1)\)个数可以任意修改,即方案数为:

\[C_{n-(t2-i+1)}^{k-(t2-i+1)}
\]

而对于\(t1,t2\),我们可以在枚举\(i\)的同时进行维护。

特殊情况

注意,有两种特殊情况会把上面的推理过程卡掉。

  • \(a_i=0\)。

    • 问题:我们会发现,根据\(t2\)的定义,此时\(t2<i\),会出锅。
    • 解决方案:每次将\(t2\)向\(i\)取\(max\)。
  • 出现相同的\(a_i\)。
    • 问题:在讨论过程中一些边界细节问题上会出锅。
    • 解决方案:不难发现,相同的\(a_i\)答案是一样的。而对于一些相同的\(a_i\),其中第一个\(a_i\)用上述方法计算答案是不会出错的。因此将所有相同的\(a_i\)的答案都赋为第一个\(a_i\)的答案即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define X 998244353
#define C(x,y) ((x)>=(y)?1LL*Fac[x]*IFac[y]%X*IFac[(x)-(y)]%X:0)
using namespace std;
int n,k,ans[N+5],Fac[N+5],IFac[N+5];
struct data {int p,v;I bool operator < (Con data& o) Con {return v<o.v;}}s[N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}
int main()
{
RI i,t1,t2,lst;for(scanf("%d%d",&n,&k),Fac[0]=i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;//预处理阶乘
for(IFac[n]=Qpow(Fac[n],X-2),i=n-1;~i;--i) IFac[i]=1LL*IFac[i+1]*(i+1)%X;//预处理阶乘逆元
for(i=1;i<=n;++i) scanf("%d",&s[s[i].p=i].v);//读入
for(sort(s+1,s+n+1),s[0].v=-1,i=1,t1=t2=0;i<=n;++i)//记得排序
{
if(s[i].v==s[i-1].v) {ans[s[i].p]=lst;continue;}//如果与上一个数一样
W(t1^n&&2*s[t1+1].v<s[i].v) ++t1;W(t2^n&&s[t2+1].v<2*s[i].v) ++t2;t2<i&&(t2=i);//更新t1,t2
ans[s[i].p]=lst=(C(n-(i-t1),k)+(t2-i<=k?C(n-(t2-i+1),k-(t2-i+1)):0))%X;//计算答案
}
for(i=1;i<=n;++i) printf("%d\n",ans[i]);return 0;//输出答案
}

【洛谷5368】[PKUSC2018] 真实排名(组合数学)的更多相关文章

  1. BZOJ5368:[PKUSC2018]真实排名(组合数学)

    Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己). 例如如果333位选手的成绩分别 ...

  2. bzoj 5368: [Pkusc2018]真实排名

    Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是 :成绩不小于他的选手的数量(包括他自己).例如如果3位选手的成绩分别是[ ...

  3. 【LOJ4632】[PKUSC2018]真实排名

    [LOJ4632][PKUSC2018]真实排名 题面 终于有题面啦!!! 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排 ...

  4. [PKUSC2018]真实排名

    [PKUSC2018]真实排名 题目大意: 有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\).定义一个人的排名为\(n\)个人中成绩不小于他的总人 ...

  5. BZOJ_5368_[Pkusc2018]真实排名_组合数

    BZOJ_5368_[Pkusc2018]真实排名_组合数 Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他 ...

  6. [PKUSC2018]真实排名——线段树+组合数

    题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...

  7. 【洛谷 P4291】 [HAOI2008]排名系统(Splay,Trie)

    题目链接 不是双倍经验我会去\(debug\)一上午? 一开始我是用的\(map+string\),跑的太慢了,T了4个点. 后来我手写了\(string\),重载了小于号,依然用的\(map\),T ...

  8. 洛谷P3158 [CQOI2011]放棋子 组合数学+DP

    题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...

  9. bzoj5368 [Pkusc2018]真实排名

    题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...

随机推荐

  1. C lang:character input and output (I/O)

    Xx_Introduction Character input and output is by more line character conpose of the text flow  Defin ...

  2. [转]Python十个高大上的语法

    Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并 ...

  3. MySQL日志简介

    一.MySQL日志简介 二.错误日志 作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志. 默认位置: $MYSQL_HOME/data/ 开启方式:(MyS ...

  4. Linux之恢复误删除文件

    前言每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug.那么如果真的删除了不该删除的文件,比如数据库.日志或执 ...

  5. PostgreSQL中的onflict

    PostgreSQL 9.5 引入了一项新功能,UPSERT(insert on conflict do),当插入遇到约束错误时,直接返回,或者改为执行UPDATE. 1.不存在则插入,存在则更新 i ...

  6. 菜鸟刷面试题(一、Java基础篇)

    目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...

  7. [译]Vulkan教程(26)描述符池和set

    [译]Vulkan教程(26)描述符池和set Descriptor pool and sets 描述符池和set Introduction 入门 The descriptor layout from ...

  8. @Import与@ImportResource注解的解读

    前言 在使用Spring-Cloud微服务框架的时候,对于@Import和@ImportResource这两个注解想必大家并不陌生.我们会经常用@Import来导入配置类或者导入一个带有@Compon ...

  9. C# 英语纠错 LanguageTool

    WPF中,对单词拼写错误,textbox有相应的附加属性可以设置. <TextBox SpellCheck.IsEnabled="True" /> 但是此属性只在WPF ...

  10. 资深程序员告诉你为什么要用Python3而不是Python2

    经常遇到这样的问题:<现在开始学习python的话,是学习python2.x还是学习python3.x比较好?>,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助 ...