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 ...
随机推荐
- c++ 重载、覆盖 (隐藏)(virtual)
背景:不用说,学习C++的你,一定知道这是个词--至于难不难懂,就看你的理解能力了,我理解也是费劲千辛万苦啊,成员函数的重载.覆盖(override).隐藏.virtual 很容易混淆,C++程序员必 ...
- First Date (hnoj12952)日期计算
First Date Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:65536KB Total submit users: 7 ...
- ORM--Entity Framework 学习(01)
关键词:Entity Framework:微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.EF提供变更跟踪.唯一性约束.惰性加载.查询事物等.开发 ...
- Java 基础知识总结 3
13.java类集 类集实际上是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充. 类集的特征: 1)这种框架是高性能的 2)框架必须允许不同类型的类集以相同的方式和高度互操作方 ...
- webpack打包小图片时进行Base64转码
关于base64 优点: base64就是一串字符串码表示的图片,在加载页面和js时一块加载出来,减少了加载图片时的http请求.加载一张图片时会发起一次http请求,http请求每次建立都会需要一定 ...
- html基础标签下
1.1 单标签 ◆注释标签 ctrl+/ ◆水平线标签 <hr> ◆换行标签 <br> 1.2 双标签 ◆段落标签 <p></p> ◆ ...
- Android5.x Notification应用解析
Notification可以让我们在获得消息的时候,在状态栏,锁屏界面来显示相应的信息,很难想象如果没有Notification,那我们的qq和微信以及其他应用没法主动通知我们,我们就需要时时的看手机 ...
- 【Python】生成词云
import matplotlib.pyplot as plt from wordcloud import WordCloud import jieba text_from_file_with_apa ...
- Cordova-conifg.xml配置
DisallowOverscroll 布尔值,默认false.如果不想要WebView出现橡皮筋滚动条,则设置为true TopActivityIndicator 字符串值,默认gray.设置顶部 ...
- SQL Server 如何设置数据库的默认初始大小和自动增长大小
我们在SQL Server中新建数据库的时候,可以选择数据库文件及日志文件的初始大小.自动增长大小和最大大小,如下图所示: 可以通过设置更改数据库初始大小.自动增长大小和最大大小: 但是其实在SQL ...