[PKUSC2018]真实排名
[PKUSC2018]真实排名
题目大意:
有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\)。定义一个人的排名为\(n\)个人中成绩不小于他的总人数。现在恰好有\(k\)个人的成绩翻倍。问对于每个人,有多少种情况满足这个人的排名不变。
思路:
排名不变的情况不外乎两种:
- \(A_i\)本身不翻倍,且满足\(\lfloor\frac{A_i+1}2\rfloor\le A_j<A_i\)的\(A_j\)均不翻倍。
- \(A_i\)本身翻倍,且满足\(A_i\le A_j<2A_i\)的\(A_j\)均翻倍。
对\(A_{1\sim n}\)进行排序,设排序后的数组为\(tmp\)。令:
p=std::lower_bound(&tmp[1],&tmp[n]+1,(a[i]+1)/2)-tmp-1
。q=std::lower_bound(&tmp[1],&tmp[n]+1,a[i])-tmp
。r=std::lower_bound(&tmp[1],&tmp[n]+1,a[i]*2)-tmp+!a[i]
。
其中\(p\)的-1
是为了方便将\(A_i\)本身也算入不翻倍的部分,而\(r\)的+!a[i]
是考虑\(A_i=0\)的情况,将\(A_i\)自身算入翻倍的部分。
显然,对于第一种情况,方案数为\(\binom{n-q+p}k\);对于第二种情况,方案数为\(\binom{n-r+q}{k-r+q}\)。
组合数可以直接预处理阶乘及阶乘逆元,剩下主要是排序和二分。时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1,mod=998244353;
int a[N],tmp[N],fact[N],factinv[N];
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int &x) {
int ret,tmp;
exgcd(x,mod,ret,tmp);
return (ret%mod+mod)%mod;
}
inline int C(const int &n,const int &m) {
if(n<m||n<0||m<0) return 0;
return (int64)fact[n]*factinv[m]%mod*factinv[n-m]%mod;
}
int main() {
const int n=getint(),k=getint();
for(register int i=1;i<=n;i++) {
tmp[i]=a[i]=getint();
}
std::sort(&tmp[1],&tmp[n]+1);
for(register int i=fact[0]=1;i<=n;i++) {
fact[i]=(int64)fact[i-1]*i%mod;
}
factinv[n]=inv(fact[n]);
for(register int i=n;i;i--) {
factinv[i-1]=(int64)factinv[i]*i%mod;
}
for(register int i=1;i<=n;i++) {
const int p=std::lower_bound(&tmp[1],&tmp[n]+1,(a[i]+1)/2)-tmp-1;
const int q=std::lower_bound(&tmp[1],&tmp[n]+1,a[i])-tmp;
const int r=std::lower_bound(&tmp[1],&tmp[n]+1,a[i]*2)-tmp+!a[i];
printf("%d\n",(C(n-q+p,k)+C(n-r+q,k-r+q))%mod);
}
return 0;
}
[PKUSC2018]真实排名的更多相关文章
- 【LOJ4632】[PKUSC2018]真实排名
[LOJ4632][PKUSC2018]真实排名 题面 终于有题面啦!!! 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排 ...
- BZOJ_5368_[Pkusc2018]真实排名_组合数
BZOJ_5368_[Pkusc2018]真实排名_组合数 Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他 ...
- [PKUSC2018]真实排名——线段树+组合数
题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...
- BZOJ5368:[PKUSC2018]真实排名(组合数学)
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己). 例如如果333位选手的成绩分别 ...
- bzoj 5368: [Pkusc2018]真实排名
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是 :成绩不小于他的选手的数量(包括他自己).例如如果3位选手的成绩分别是[ ...
- bzoj5368 [Pkusc2018]真实排名
题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...
- 【洛谷5368】[PKUSC2018] 真实排名(组合数学)
点此看题面 大致题意: 有\(n\)个数字,定义一个数的排名为不小于它的数的个数.现要随机将其中\(k\)个数乘\(2\),求对于每个数有多少种方案使其排名不变. 分类讨论 对于这种题目,我们可以分类 ...
- Luogu P5368 [PKUSC2018]真实排名
老年选手只会做SB题了(还调了好久) 很容易想到分类讨论,按第\(i\)个人有没有翻倍来算 若\(a_i\)未翻倍,显然此时将\([0,\lceil \frac{a_i}{2}\rceil)\)的数和 ...
- LOJ6432 [PKUSC2018] 真实排名 【组合数】
题目分析: 做三个指针然后预处理阶乘就行. 题目代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; struct n ...
随机推荐
- [一] sqlinject bypass
http://103.238.227.13:10087/?id=1 由源码来看是没有办法注入的,几乎都是过滤了的.但是经过测试加<>符号会被直接替换为空. 那么就可以借助此进行bypass ...
- 工具安装===Sublime Text-安装
Sublime Text 是一款通用型轻量级编辑器,支持多种编程语言.有许多功能强大的快捷键(如 Ctrl+d),支持丰富的插件扩展.如果平时需要在不同编程语言间切换,那么它将会是一个,不错的选择. ...
- binlog_server备份binlogs
在主库上建一个复制用的账号: root@localhost [(none)]>grant replication slave on *.* to 'wyz'@'%' identified by ...
- 为什么要用Jedis连接池+浅谈jedis连接池使用
为什么要使用Jedis连接池 Redis作为缓存数据库理论上和MySQL一样需要客户端和服务端建立起来连接进行相关操作,使用MySQL的时候相信大家都会使用一款开源的连接池,例如C3P0.因为直连会消 ...
- PBFT算法的相关问题
PBFT(99.02年发了两篇论文)-从开始的口头算法(指数级)到多项式级 要求 n>3f why: 个人简单理解:注意主节点是可以拜占庭的,从节点对于(n,v,m)的投票最开始也是基于主节点给 ...
- C语言面试题总结(一)
以前的记录都在电子笔记里,倒不如拿出来,有错的地方和大家交流. 1.指针操作: 如下例,设a内存地址为OX00 int a =10; int *p = &a; *a 编译错误 a表示10 *p ...
- javascript 线程问题小记
大家都知道javascript是单线程执行的,alert之后,就无法执行以下的函数,浏览器是按照从上到下的顺序来安排解析显示的. 其实虽然javascript是单线程的,但是浏览器是多线程的,典型的浏 ...
- mysql 5.1.7.17 zip安装 和 隔段时间服务不见了处理
Mysql社区版下载地址:http://dev.mysql.com/downloads/mysql/ 因为我的系统版本是64,因此这里下载x64版本.下载完之后解压至D:\Dev\Mysql(即为my ...
- CF914F Substrings in a String
Description 给你一个字符串ss,共有qq次操作,每个都是下面两种形式的一种. 11 ii cc 这个操作表示将字符串ss的第ii项变为字符cc 22 ll rr yy 这个操作表示输出字符 ...
- 6:django 通用视图
上一节我们介绍了django视图函数里面几个常用的函数,这节我们来看一下django为我们提供的一些通用视图吧 在最后面有我自己的示例代码,html部分太多了就不贴了 “简单”视图函数 正如名字所言, ...