[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\) 位选手的排名没有发生改变的情况数。

样例 #1

样例输入 #1

3 2
1 2 3

样例输出 #1

3
1
2

提示

对于 \(10\%\) 的数据,有 \(1\leq n\leq 15\)

对于 \(35\%\) 的数据,有 \(1\leq n\leq 10^3\)

另有 \(10\%\) 的数据,满足每个人的成绩都互不相同

另有 \(10\%\) 的数据,满足 \(0\leq A_i\leq 10^5\)

另有 \(10\%\) 的数据,满足 \(k=85\),\(0\leq A_i\leq 600\)

对于\(100\%\)的数据,有\(1\leq k < n\leq 10^5\),\(0\leq A_i\leq 10^9\)

考虑把所有 \(a\) 排序后处理。

\(a\) 数组中,如果第 \(i\) 个数不乘2,那么大于等于 \(a_i\) 的数随便乘,小于 \(a_i\) 的,要满足 \(2a_j<a_i\) 的 \(a_j\) 才可以给 \(a_j\) 乘2.

如果第 \(i\) 个数乘了 2,那么 所有满足 \(a_i\le a_j,2a_i>a_j\) 的数都要乘个 2,其余随便。

用双指针维护即可。

小细节:

  1. 注意双指针时 while 里面两个都不去等。
  2. 注意处理组合数时不要把 \(k\) 减出界。
  3. 注意 \(2\times 0=0\),所以要特判 \(a_i=0\)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,P=998244353;
int n,k,a[N],f[N],id[N],inv[N],ans[N],iv[N],l,r;
int cmp(int x,int y)
{
return a[x]<a[y];
}
int calc(int x,int y)
{
// if(x==1&&y==0)
// printf("%d %d %d\n",f[x],iv[y],iv[x-y]);
return 1LL*f[x]*iv[y]%P*iv[x-y]%P;
}
int main()
{
iv[0]=inv[1]=iv[1]=f[0]=f[1]=1;
scanf("%d%d",&n,&k);
for(int i=2;i<=n;i++)
{
f[i]=1LL*f[i-1]*i%P;
inv[i]=1LL*(P-P/i)*inv[P%i]%P;
iv[i]=1LL*iv[i-1]*inv[i]%P;
}
// printf("%d\n",calc(2,2));
for(int i=1;i<=n;i++)
scanf("%d",a+i),id[i]=i;
sort(id+1,id+n+1,cmp);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
r=max(r,i);
if(i^1&&a[i]==a[i-1])
{
ans[id[i]]=ans[id[i-1]];
continue;
}
// printf("%d %d\n",l,r);
while(a[l+1]*2<a[i])
++l;
ans[id[i]]=calc(l+n-i,k);
while(r^n&&a[i]*2>a[r+1])
++r;
// printf("%d %d\n",i-1+n-r,k-r+i-1);
if(r-i+1<=k)
(ans[id[i]]+=calc(i-1+n-r,k-r+i-1))%=P;
// printf("%d %d\n",l,r);
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}

[洛谷P5368] [PKUSC2018] 真实排名的更多相关文章

  1. Luogu P5368 [PKUSC2018]真实排名

    老年选手只会做SB题了(还调了好久) 很容易想到分类讨论,按第\(i\)个人有没有翻倍来算 若\(a_i\)未翻倍,显然此时将\([0,\lceil \frac{a_i}{2}\rceil)\)的数和 ...

  2. 「Luogu P5368 [PKUSC2018]真实排名」

    PKUSC签到题 题目大意 给出一个长度为 \(N\) 的序列,序列中有 \(K\) 个数会乘二,对于每个数计算在乘二后大于等于这个数的个数与乘二前没有发生变化的方案数. 分析 思路很清晰,可以将答案 ...

  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. 【洛谷5368】[PKUSC2018] 真实排名(组合数学)

    点此看题面 大致题意: 有\(n\)个数字,定义一个数的排名为不小于它的数的个数.现要随机将其中\(k\)个数乘\(2\),求对于每个数有多少种方案使其排名不变. 分类讨论 对于这种题目,我们可以分类 ...

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

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

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

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

随机推荐

  1. Code Llama:Llama 2 学会写代码了!

    引言 Code Llama 是为代码类任务而生的一组最先进的.开放的 Llama 2 模型,我们很高兴能将其集成入 Hugging Face 生态系统!Code Llama 使用与 Llama 2 相 ...

  2. Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

    系列文章 Nomad 系列文章 Traefik 系列文章 Tailscale 系列文章 概述 终于到了令人启动的环节了:Nomad+Traefik+Tailscale 集成实现零信任安全. 在这里: ...

  3. .NET C#基础(9):资源释放 - 需要介入的资源管理

    1. 什么是IDisposable?   IDisposable接口是一个用于约定可进行释放资源操作的接口,一个类实现该接口则意味着可以使用接口约定的方法Dispose来释放资源.其定义如下: pub ...

  4. Laf 云开发平台及其实现原理

    Laf 产品介绍 自我介绍 大家好,我是来自 Laf 团队的王子俊,很高兴今天能在这里给大家分享我们 Laf 云开发平台及其实现原理.本来想说一点什么天气之类的话作为开头,但主持人都说完啦,我就不多说 ...

  5. Github、Gitee优秀的开源项目

    收集 Github.Gitee优秀的开源项目,并进行归类整理.项目地址 目录 编程语言项目 SprinBoot 项目 源码分析项目 前后端分离项目 Vue2 项目 Vue3 项目 微服务项目 Api ...

  6. Vue Vuex状态管理

    1.1 理解 Vuex 1.1.1 Vuex 是什么 概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 Vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组 ...

  7. dp_ppi转光纤模块连接200PLC组态王通信案例

    DP_PPI转光纤模块连接200PLC组态王光纤通信在冷却塔控制系统案例 现场背景介绍: 西门子200 CPU226PLC通过兴达易控dp转光纤模块在200PLC系统中ppi转光纤实现PCL与组态王2 ...

  8. Unicode 字符集与 UTF-8 编码系统

    Unicode 字符集与 UTF-8 编码系统 Synopsis: Unicode 只是包含了所有语言符号.图形符号等的统一字符集(character set,每个字符都有唯一的 Unicode co ...

  9. 【题解】《PTA-Python程序设计》题目集分享

    第1章-1 从键盘输入两个数,求它们的和并输出 (30 分) 本题目要求读入2个整数A和B,然后输出它们的和. 输入格式: 在一行中给出一个被加数在另一行中给出一个加数 输出格式: 在一行中输出和值. ...

  10. Python3中的printable

    import string characters = string.printable # printable 是用作字符串常量的预初始化字符串.里面包含所有的标点符号,数字 print(charac ...