题目描述:

bz

luogu

题解:

组合数计数问题。

首先注意排名指的是成绩不小于他的选手的数量(包括他自己)

考虑怎么增大才能改变排名。

小学生都知道,对于成绩为$x$的人,让他自己不动并让$\frac{x}{2} < y \leq x$的$y$增大能把$x$挤下去。

于是分情况讨论。

自己不动,那么上述人都不能增大,答案为在剩下的人中选$k$个的方案数;

自己动,那么自己超过了$\frac{z}{2} \leq x < z$。若这种人有$i$个,那么这$i$个必须都加倍,在$i<=k-1$答案为剩下的人中选$k-1-i$个的方案数。

排序后可以双指针直接扫,这样排序$O(nlogn)$,计算$O(n)$,跑起来还是比较快的。

最重要的是最大值要至少开成$2e9$。

我不会说我开$0x3f3f3f3f$疯狂$RE$的。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = ;
  7. const int MOD = ;
  8. template<typename T>
  9. inline void read(T&x)
  10. {
  11. T f = ,c = ;char ch=getchar();
  12. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  13. while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
  14. x = f*c;
  15. }
  16. int n,k,v[N],h[N];
  17. ll jc[N<<],ny[N<<],jn[N<<],ans[N],to[N];
  18. ll C(ll x,ll y){return jn[x]*jn[y-x]%MOD*jc[y]%MOD;}
  19. struct Pair
  20. {
  21. int x,y;
  22. Pair(){}
  23. Pair(int x,int y):x(x),y(y){}
  24. }p[N];
  25. bool cmp(Pair a,Pair b){return a.x<b.x;}
  26. void init()
  27. {
  28. jc[]=jc[]=jn[]=jn[]=ny[]=;
  29. for(int i=;i<=*n;i++)
  30. {
  31. ny[i] = ((MOD-MOD/i)*ny[MOD%i]%MOD+MOD)%MOD;
  32. jc[i] = (jc[i-]*i)%MOD;
  33. jn[i] = (jn[i-]*ny[i])%MOD;
  34. }
  35. }
  36. int main()
  37. {
  38. read(n),read(k);init();
  39. for(int i=;i<=n;i++)
  40. {
  41. read(v[i]);
  42. p[i]=Pair(v[i],i);
  43. }
  44. sort(p+,p++n,cmp);
  45. int mx = ;
  46. for(int las=-,i=;i<=n;i++)
  47. {
  48. if(p[i].x!=las)
  49. {
  50. las = p[i].x;
  51. to[++mx]=las;
  52. }
  53. v[p[i].y]=mx;
  54. h[mx]++;
  55. }
  56. to[mx+]=0x3f3f3f3f3f3f3f3fll;
  57. for(int i=;i<=mx+;i++)h[i]+=h[i-];
  58. for(int tmp,i=,j1=,j2=;i<=mx;i++)
  59. {
  60. while(2ll*to[j1+]<to[i])j1++;
  61. while(to[j2+]<2ll*to[i])j2++;
  62. if(!to[i]){ans[i]=C(k,n);continue;}
  63. if((tmp=h[j1]+n-h[i-]-)>=k)ans[i]=C(k,tmp);
  64. if((tmp=h[j2]-h[i-]-)<=k-&&k--tmp<=h[i-]+n-h[j2])ans[i]=(ans[i]+C(k--tmp,h[i-]+n-h[j2]))%MOD;
  65. }
  66. for(int i=;i<=n;i++)printf("%lld\n",ans[v[i]]);
  67. return ;
  68. }

bzoj5368 [Pkusc2018]真实排名的更多相关文章

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

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

  2. 【LOJ4632】[PKUSC2018]真实排名

    [LOJ4632][PKUSC2018]真实排名 题面 终于有题面啦!!! 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排 ...

  3. [PKUSC2018]真实排名

    [PKUSC2018]真实排名 题目大意: 有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\).定义一个人的排名为\(n\)个人中成绩不小于他的总人 ...

  4. BZOJ_5368_[Pkusc2018]真实排名_组合数

    BZOJ_5368_[Pkusc2018]真实排名_组合数 Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他 ...

  5. [PKUSC2018]真实排名——线段树+组合数

    题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...

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

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

  7. 【洛谷5368】[PKUSC2018] 真实排名(组合数学)

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

  8. Luogu P5368 [PKUSC2018]真实排名

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

  9. LOJ6432 [PKUSC2018] 真实排名 【组合数】

    题目分析: 做三个指针然后预处理阶乘就行. 题目代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; struct n ...

随机推荐

  1. jstl标签库不起作用,直接输出表达式

    引用jstl.jar包 在jsp页面添加<%@ page isELIgnored="false"%>即可

  2. 快速对接payjs的个人支付接口(收银台模式)

    近期在了解个人支付接口,希望能解决我在微信上支付的问题.找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西.同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通 ...

  3. PostgreSQL-6-数据分组

    基本语法 SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2 HAVING [ cond ...

  4. 洛谷 P2231 [HNOI2002]跳蚤

    https://www.luogu.org/problemnew/show/P2231 题意相当于:有n个位置a[1..n],每个位置可以填[1,m]中任一个整数,问共有多少种填法满足gcd(a[1] ...

  5. log4j打印错误日志输出 利用sql取出的值放在list集合中,集合中的字段类型为映射类类型

    public ServiceResult<List<KefuDetail>> MaxRespondtime(Date startDate,Date endDate, Strin ...

  6. shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。

    一.shell脚本建立: shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行: 1.脚本开头:     规范的脚本第一行需要指出有哪个程序(解释器)来执行脚本中的内容,在L ...

  7. 简单的鼠标经过特效-mouse事件

    <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  8. 服务器 未能加载文件或程序集“XXXX”或它的某一个依赖项。试图加载格式不正确的程序。

    ,本人采用的第一种解决办法解决,已解决 问题2: 在同一个服务器上想要一个IP有两个网址,配置端口号,给新端口号开权限

  9. Oracle Data Integrator 12c 安装(ODI安装)

    Oracle Data Integrator 12c 安装(ODI安装) 企业版安装步骤(包含独立安装步骤) 官网下载Oracle Data Integrator 12cR2 (12.2.1.0.0) ...

  10. uvm_globals——告诉这个世界我爱你

    uvm_globals.svh 存放全局的变量和方法.当UVM平台启动时,便在uvm_globals查找相应的方法,uvm_globals 的方法实现也比较简单,就是调用uvm_root对应的方法.其 ...