【LOJ4632】[PKUSC2018]真实排名
【LOJ4632】[PKUSC2018]真实排名
题面
终于有题面啦!!!
题目描述
小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己)。例如如果 \(3\) 位选手的成绩分别是 \([1,2 ,2]\) ,那么他们的排名分别是 \([3,2,2]\) 。
拥有上帝视角的你知道所有选手的实力,所以在考试前就精准地估计了每个人的成绩,设你估计的第 \(i\) 个选手的成绩为\(A_i\),且由于你是上帝视角,所以如果不发生任何意外的话,你估计的成绩就是选手的最终成绩。
但是在比赛当天发生了不可抗的事故(例如遭受到了外星人的攻击),导致有一些选手的成绩变成了最终成绩的两倍,即便是有上帝视角的你也不知道具体是哪些选手的成绩翻倍了,唯一知道的信息是这样的选手恰好有 \(k\) 个。
现在你需要计算,经过了不可抗事故后,对于第 \(i\) 位选手,有多少种情况满足他的排名没有改变。
由于答案可能过大,所以你只需要输出答案对 \(998244353\) 取模的值即可。
输入格式
第一行两个正整数 \(n,k\)
第二行 \(n\) 个非负整数 \(A_1..A_n\)
输出格式
输出\(n\)行,第 \(i\) 行一个非负整数 \(ans_i\),表示经过不可抗事故后,第 \(i\) 位选手的排名没有发生改变的情况数。
样例
样例输入
3 2
1 2 3
输出
3
1
2
提示与说明
对于\(10\%\)的数据,有 \(1\leq n\leq 151\)
对于\(35\%\)的数据,有 \(1\leq n\leq 10^3\)
另有\(10\%\)的数据,满足每个人的成绩都互不相同
另有\(10\%\)的数据,满足\(A_i\leq 10^5\)
另有\(10\%\)的数据,满足\(k=85\),\(0\leq A_i\leq 6000\)
对于\(100\%\)的数据,有\(1\leq k < n\leq 10^5\),\(0\leq A_i\leq 10^9\)
题解
其实还是挺容易的qaq,只不过细节比较多
分别考虑你现在计算的那个位置选不选
如果不选,可以选比它大的或小于它\(\frac 12\)的。
那么假如我们钦定它选,则必须动\([a_i,2a_i]\)的,
计算一下有多少,其余的随便选就行了。
每一种情况都预处理阶乘用组合数就好啦
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int Mod = 998244353;
const int MAX_N = 1e5 + 5;
int fpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = 1ll * res * x % Mod;
y >>= 1;
x = 1ll * x * x % Mod;
}
return res;
}
int N, K, A[MAX_N], fac[MAX_N << 1], inv[MAX_N << 1];
int C(int n, int m) {
if (m > n || m < 0) return 0;
return 1ll * fac[n] * inv[m] % Mod * inv[n - m] % Mod;
}
int X1[MAX_N], X2[MAX_N], ans[MAX_N];
int main () {
N = gi(), K = gi();
fac[0] = 1; for (int i = 1; i <= 2 * N; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
inv[2 * N] = fpow(fac[2 * N], Mod - 2); for (int i = 2 * N - 1; ~i; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % Mod;
for (int i = 1; i <= N; i++) A[i] = gi(), X1[i] = A[i], X2[i] = A[i] << 1;
sort(&X1[1], &X1[N + 1]);
sort(&X2[1], &X2[N + 1]);
for (int i = 1; i <= N; i++) {
if (A[i] == 0) { ans[i] = C(N, K); continue; }
int x = N - 1 - (lower_bound(&X2[1], &X2[N + 1], A[i]) - X2 - 1) - (N - (lower_bound(&X1[1], &X1[N + 1], A[i]) - X1));
int y = (N - (lower_bound(&X1[1], &X1[N + 1], A[i]) - X1) + 1) - 1 - (N - (lower_bound(&X1[1], &X1[N + 1], A[i]) - X1));
ans[i] = C(x, y) * C(N - 1 - x, K - y) % Mod;
}
for (int i = 1; i <= N; i++) {
if (A[i] == 0) continue;
int x = N - 1 - (lower_bound(&X2[1], &X2[N + 1], A[i] << 1) - X2 - 1) - (N - (lower_bound(&X1[1], &X1[N + 1], A[i] << 1) - X1) + 1);
int y = N - (lower_bound(&X1[1], &X1[N + 1], A[i]) - X1) - (N - (lower_bound(&X1[1], &X1[N + 1], A[i] << 1) - X1) + 1);
ans[i] = (ans[i] + C(x, y) * C(N - 1 - x, K - y - 1) % Mod) % Mod;
}
for (int i = 1; i <= N; i++) printf("%d\n", ans[i]);
return 0;
}
【LOJ4632】[PKUSC2018]真实排名的更多相关文章
- [PKUSC2018]真实排名
[PKUSC2018]真实排名 题目大意: 有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\).定义一个人的排名为\(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 ...
随机推荐
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
- python3通过qq邮箱发送邮件
python3通过qq邮箱发送邮件 0.了解qq邮箱的SMTP QQ邮箱 POP3 和 SMTP 服务器地址设置如下: 邮箱 POP3服务器(端口995) SMTP服务器(端口465或587) qq. ...
- git 如何忽略文件以及使用.gitignore 不生效的解决办法
(1) git 如何忽略文件 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一 ...
- 判断是否POST提交
if(strtolower($_SERVER['REQUEST_METHOD']) == 'post'){} //判断是否POST提交
- EF Core 2.0 已经支持自动生成父子关系表的实体
现在我们在SQL Server数据库中有Person表如下: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Cr ...
- CSS节选——选择器
CSS,cascading style sheet,层叠样式表,请留意层叠概念. css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:targ ...
- 依赖项从GIT上拉下来出现黄色三角形解决方法
1.进入程序包管理器设置 2.添加程序包源=>输入名称(自己定\默认)=>NuGet源地址https://nuget.org/api/v2/(2019年1月30号可用)更新确认后重生项目即 ...
- 关于keil不同容量和不同引脚大小的编译以及下载出错问题
如果遇到这个问题一般可能有四个原因(以STM32F103C8T6为例) 1.芯片型号没有选对 2.startup文件可能没有选对,startup文件常用的分为3种,startup_stm32f10x_ ...
- Oracle 存储结构三
Oracle数据库服务器自动管理空间的方法 段空间的分配 空间以区间的形式分配给段,区间是一组连续的Oracle块.每个数据文件都有一个位图,来描述文件中块的状态,块可能是空闲的,也可能是区间中已分配 ...
- C# WinForm开发系列 - ListBox/ListView/Panel【zz】
原文传送:http://www.cnblogs.com/peterzb/archive/2009/06/18/1505424.html 1.ColorListBox ColorListBox.zi ...