BZOJ5368:[PKUSC2018]真实排名(组合数学)
Description
Input
Output
Sample Input
1 2 3
Sample Output
3
1
2
样例解释
一共有3种情况:(1,2)翻倍,(1,3)翻倍,(2,3)翻倍。
对于第一个选手来说,他的成绩就算翻倍,其他人都不低于他,所以任意情况下他的排名都不会改变。
对于第二个选手来说,如果是(1,2)翻倍,成绩变成(2,4,3),他的排名变成了第一;
如果是(1,3)翻倍,则成绩变成(2,2,6),他的排名变成了第三;如果是(2,3)翻倍,则成绩变成(1,4,6),他的排名还是第二。
所以只有一种情况。
对于第三个选手来说,如果是(1,2)翻倍,他的排名会变成第二,其他情况下都还是第一。
Solution
传说中的送温暖签到题QAQ?$pkuwc$的时候咋没有呢……
先把数$sort$一下,然后一个一个考虑。
对于当前数$b[i]$,分两种情况(如果$b[i]=b[i-1]$就答案等于前一个数的答案然后$continue$):
1、本身不翻倍,那么只有$b[i]$前面的某一段数是一定不能选的,因为如果选了这一段数的话就会有数超过$b[i]$从而改变排名……二分找一下就好了。
2、$b[i]$本身翻倍,这样$b[i]$后面的某一段数就必须得翻倍把$b[i]$翻下来,不然排名仍然会变。仍然二分找一下。
Code
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define N (100009)
#define MOD (998244353)
using namespace std; struct Node{int x,id,ans;}a[N];
int n,k,x,pos,b[N],inv[N],fac[N],facinv[N];
bool cmp1(Node a,Node b) {return a.x<b.x;}
bool cmp2(Node a,Node b) {return a.id<b.id;} void Init()
{
inv[]=fac[]=facinv[]=;
for (int i=; i<=n; ++i)
{
if (i!=) inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD;
fac[i]=1ll*fac[i-]*i%MOD; facinv[i]=1ll*facinv[i-]*inv[i]%MOD;
}
} int C(int n,int m)
{
if (n<m) return ;
return 1ll*fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;
} int main()
{
scanf("%d%d",&n,&k);
Init();
for (int i=; i<=n; ++i)
scanf("%d",&a[i].x), a[i].id=i;
sort(a+,a+n+,cmp1);
for (int i=; i<=n; ++i) b[i]=a[i].x; b[]=-;
for (int i=; i<=n; ++i)
{
if (b[i]==b[i-]) {a[i].ans=a[i-].ans; continue;} x=b[i]/+(b[i]%);//自己不翻倍
pos=lower_bound(b+,b+i,x)-b;
a[i].ans=(a[i].ans+C(pos-+n-i,k))%MOD;//[pos,i-1]不能翻倍,再算上i本身 x=b[i]*;//自己翻倍
pos=lower_bound(b+i+,b+n+,x)-b;
pos--;//[i+1,pos]要翻倍
if (pos-i>k-) continue;
a[i].ans=(a[i].ans+C(i-+n-pos,k--(pos-i)))%MOD;
}
sort(a+,a+n+,cmp2);
for (int i=; i<=n; ++i)
printf("%d\n",a[i].ans);
}
BZOJ5368:[PKUSC2018]真实排名(组合数学)的更多相关文章
- bzoj5368 [Pkusc2018]真实排名
题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...
- 【LOJ4632】[PKUSC2018]真实排名
[LOJ4632][PKUSC2018]真实排名 题面 终于有题面啦!!! 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排 ...
- [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.当 ...
- 【洛谷5368】[PKUSC2018] 真实排名(组合数学)
点此看题面 大致题意: 有\(n\)个数字,定义一个数的排名为不小于它的数的个数.现要随机将其中\(k\)个数乘\(2\),求对于每个数有多少种方案使其排名不变. 分类讨论 对于这种题目,我们可以分类 ...
- bzoj 5368: [Pkusc2018]真实排名
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是 :成绩不小于他的选手的数量(包括他自己).例如如果3位选手的成绩分别是[ ...
- 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 ...
随机推荐
- PetaPoco源代码学习--1.使用的Attribute介绍
新版本的PetaPoco使用特性进行注解的形式来代替的老版本的映射类的形式.新版本中使用的特性主要包括以下几种: 名称 用途 TableNameAttribute Class 指定POCO实体类对 ...
- C# Thread.Abort方法真的让线程停止了吗?
大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...
- Linux应用调试-strace命令
1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...
- oracle安装与备份导入
win10安装oracle因运行版本问题导致安装时提示错误(可能win10未被甲骨文公司认证) 跳过的问题 需要更改配置文件: 配置位置在 : 具体操作如下图: 在安装时win10跳过了 许是因为环 ...
- 【CDQ分治】[HNOI2010]城市建设
题目链接 线段树分治+LCT只有80 然后就有了CDQ分治的做法 把不可能在生成树里的扔到后面 把一定在生成树里的扔到并查集里存起来 分治到l=r,修改边权,跑个kruskal就行了 由于要支持撤销, ...
- Mac下使用VScode进行C/C++开发
1.安装 从VScode官网下载Mac系统适用的VScode安装包,下载完成后,将zip安装包解压到桌面即可. 2.插件安装 实现 C/Cpp 代码自动补全,函数跳转. 打开VScode后,按下组合键 ...
- Python Django框架笔记(五):模型
#前言部分来自Django Book (一) 前言 大多数web应用本质上: 1. 每个页面都是将数据库的数据以HTML格式进行展现. 2. 向用户提供修改数据库数据的方法.(例如:注册.发表评 ...
- pytest+allure+jenkins +python2.7
pip install lxml==3.8.0 pip install pytest-allure-adaptor
- python 元组编码和解码问题
先看一个例子: (u'agentEnum', True, '200', {u'msg': u'\u6210\u529f', u'code': 1}) 在2.7.15版本中,如果有下面代码: def f ...
- windows 服务器MYSQL 数据库安装配置
一.到官网下载MYSQL 打开官网地址:www.mysql.com, 选择 DOWNLOADS,进入到MySQL的下载页面,在页面的底部有一个MySQL Community Edition, 并且下面 ...