bzoj5368 [Pkusc2018]真实排名
题目描述:
题解:
组合数计数问题。
首先注意排名指的是成绩不小于他的选手的数量(包括他自己)。
考虑怎么增大才能改变排名。
小学生都知道,对于成绩为$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$的。
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- const int N = ;
- const int MOD = ;
- template<typename T>
- inline void read(T&x)
- {
- T f = ,c = ;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
- x = f*c;
- }
- int n,k,v[N],h[N];
- ll jc[N<<],ny[N<<],jn[N<<],ans[N],to[N];
- ll C(ll x,ll y){return jn[x]*jn[y-x]%MOD*jc[y]%MOD;}
- struct Pair
- {
- int x,y;
- Pair(){}
- Pair(int x,int y):x(x),y(y){}
- }p[N];
- bool cmp(Pair a,Pair b){return a.x<b.x;}
- void init()
- {
- jc[]=jc[]=jn[]=jn[]=ny[]=;
- for(int i=;i<=*n;i++)
- {
- ny[i] = ((MOD-MOD/i)*ny[MOD%i]%MOD+MOD)%MOD;
- jc[i] = (jc[i-]*i)%MOD;
- jn[i] = (jn[i-]*ny[i])%MOD;
- }
- }
- int main()
- {
- read(n),read(k);init();
- for(int i=;i<=n;i++)
- {
- read(v[i]);
- p[i]=Pair(v[i],i);
- }
- sort(p+,p++n,cmp);
- int mx = ;
- for(int las=-,i=;i<=n;i++)
- {
- if(p[i].x!=las)
- {
- las = p[i].x;
- to[++mx]=las;
- }
- v[p[i].y]=mx;
- h[mx]++;
- }
- to[mx+]=0x3f3f3f3f3f3f3f3fll;
- for(int i=;i<=mx+;i++)h[i]+=h[i-];
- for(int tmp,i=,j1=,j2=;i<=mx;i++)
- {
- while(2ll*to[j1+]<to[i])j1++;
- while(to[j2+]<2ll*to[i])j2++;
- if(!to[i]){ans[i]=C(k,n);continue;}
- if((tmp=h[j1]+n-h[i-]-)>=k)ans[i]=C(k,tmp);
- 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;
- }
- for(int i=;i<=n;i++)printf("%lld\n",ans[v[i]]);
- return ;
- }
bzoj5368 [Pkusc2018]真实排名的更多相关文章
- BZOJ5368:[PKUSC2018]真实排名(组合数学)
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己). 例如如果333位选手的成绩分别 ...
- 【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.当 ...
- bzoj 5368: [Pkusc2018]真实排名
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是 :成绩不小于他的选手的数量(包括他自己).例如如果3位选手的成绩分别是[ ...
- 【洛谷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 ...
随机推荐
- jstl标签库不起作用,直接输出表达式
引用jstl.jar包 在jsp页面添加<%@ page isELIgnored="false"%>即可
- 快速对接payjs的个人支付接口(收银台模式)
近期在了解个人支付接口,希望能解决我在微信上支付的问题.找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西.同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通 ...
- PostgreSQL-6-数据分组
基本语法 SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2 HAVING [ cond ...
- 洛谷 P2231 [HNOI2002]跳蚤
https://www.luogu.org/problemnew/show/P2231 题意相当于:有n个位置a[1..n],每个位置可以填[1,m]中任一个整数,问共有多少种填法满足gcd(a[1] ...
- log4j打印错误日志输出 利用sql取出的值放在list集合中,集合中的字段类型为映射类类型
public ServiceResult<List<KefuDetail>> MaxRespondtime(Date startDate,Date endDate, Strin ...
- shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。
一.shell脚本建立: shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行: 1.脚本开头: 规范的脚本第一行需要指出有哪个程序(解释器)来执行脚本中的内容,在L ...
- 简单的鼠标经过特效-mouse事件
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- 服务器 未能加载文件或程序集“XXXX”或它的某一个依赖项。试图加载格式不正确的程序。
,本人采用的第一种解决办法解决,已解决 问题2: 在同一个服务器上想要一个IP有两个网址,配置端口号,给新端口号开权限
- Oracle Data Integrator 12c 安装(ODI安装)
Oracle Data Integrator 12c 安装(ODI安装) 企业版安装步骤(包含独立安装步骤) 官网下载Oracle Data Integrator 12cR2 (12.2.1.0.0) ...
- uvm_globals——告诉这个世界我爱你
uvm_globals.svh 存放全局的变量和方法.当UVM平台启动时,便在uvm_globals查找相应的方法,uvm_globals 的方法实现也比较简单,就是调用uvm_root对应的方法.其 ...