BZOJ_5368_[Pkusc2018]真实排名_组合数
BZOJ_5368_[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)翻倍,他的排名会变成第二,其他情况下都还是第一。
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
调了一晚上!!!最后发现组合数求错了!!没判m<0的情况!!那应该RE啊怎么一直WA啊...
求出每个人的排名rank然后分这个人是否乘2进行讨论,设这个人的分数为w。
每次求出 原来小于w,乘2后也小于w的个数p1.原来大于等于w,乘2后也大于等于w的个数p3,其他的人数p2。设第三种人选了q2个人。
有p3+q2=rank-1
那么答案为C(p2)(q2)*C(p1+p3)(K-q2)或C(p2)(q2)*C(p1+p3)(K-q2-1)。
注意当a[i]=0时直接令答案为C(n)(K)即可,省的在求p3的时候特判。
代码:
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
#define mod 998244353
#define N 100050
int n,K;
ll fac[N<<1],inv[N<<1],ans[N];
int t1[N],t2[N],p1,p2,p3,Rank[N],a[N];
ll qp(ll x,ll y) {
ll re=1; for(;y;y>>=1ll,x=x*x%mod) if(y&1ll) re=re*x%mod; return re;
}
void init() {
int i;
for(fac[0]=1,i=1;i<=n+n;i++) fac[i]=fac[i-1]*i%mod;
inv[n+n]=qp(fac[n+n],mod-2);
for(i=n+n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
ll C(ll n,ll m) {
if(m<0||n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main() {
scanf("%d%d",&n,&K);
init();
int i;
for(i=1;i<=n;i++) {
scanf("%d",&a[i]); t1[i]=a[i]; t2[i]=a[i]<<1;
}
sort(t1+1,t1+n+1);
sort(t2+1,t2+n+1);
for(i=1;i<=n;i++) {
Rank[i]=n-(lower_bound(t1+1,t1+n+1,a[i])-t1)+1;
}
for(i=1;i<=n;i++) {
if(a[i]==0) {ans[i]=C(n,K); continue;}
p1=lower_bound(t2+1,t2+n+1,a[i])-t2-1;
p3=n-(lower_bound(t1+1,t1+n+1,a[i])-t1);
p2=n-1-p1-p3;
int q2=Rank[i]-1-p3;
ans[i]=C(p2,q2)*C(n-1-p2,K-q2)%mod;
}
for(i=1;i<=n;i++) {
if(a[i]==0) continue;
p1=lower_bound(t2+1,t2+n+1,a[i]<<1)-t2-1;
p3=n-(lower_bound(t1+1,t1+n+1,a[i]<<1)-t1)+1;
p2=n-1-p1-p3;
int q2=Rank[i]-1-p3;
ans[i]=(ans[i]+C(p2,q2)*C(n-1-p2,K-q2-1)%mod)%mod;
}
for(i=1;i<=n;i++) printf("%lld\n",ans[i]);
}
BZOJ_5368_[Pkusc2018]真实排名_组合数的更多相关文章
- LOJ6432 [PKUSC2018] 真实排名 【组合数】
题目分析: 做三个指针然后预处理阶乘就行. 题目代码: #include<bits/stdc++.h> using namespace std; ; ; int n,k; struct n ...
- [PKUSC2018]真实排名——线段树+组合数
题目链接: [PKUSC2018]真实排名 对于每个数$val$分两种情况讨论: 1.当$val$不翻倍时,那么可以翻倍的是权值比$\frac{val-1}{2}$小的和大于等于$val$的. 2.当 ...
- 【LOJ4632】[PKUSC2018]真实排名
[LOJ4632][PKUSC2018]真实排名 题面 终于有题面啦!!! 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排 ...
- [PKUSC2018]真实排名
[PKUSC2018]真实排名 题目大意: 有\(n(n\le10^5)\)个人,每个人有一个成绩\(A_i(0\le A_i\le10^9)\).定义一个人的排名为\(n\)个人中成绩不小于他的总人 ...
- Loj 6432. 「PKUSC2018」真实排名 (组合数)
题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < ...
- bzoj5368 [Pkusc2018]真实排名
题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...
- BZOJ5368:[PKUSC2018]真实排名(组合数学)
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己). 例如如果333位选手的成绩分别 ...
- bzoj 5368: [Pkusc2018]真实排名
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是 :成绩不小于他的选手的数量(包括他自己).例如如果3位选手的成绩分别是[ ...
- 【洛谷5368】[PKUSC2018] 真实排名(组合数学)
点此看题面 大致题意: 有\(n\)个数字,定义一个数的排名为不小于它的数的个数.现要随机将其中\(k\)个数乘\(2\),求对于每个数有多少种方案使其排名不变. 分类讨论 对于这种题目,我们可以分类 ...
随机推荐
- Laya Tween循环
Laya Tween循环 @author ixenos 需求:做一个循环的缓动动画 方案: 1)如果只是线性变化,那么直接使用timer或者frameLoop来变化 2)如果需要有非线性变化,那么使用 ...
- POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~
滑雪 Time Limit: 1000MS Memory Limit: 65536k ...
- python多线程--线程同步
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步. 使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire ...
- SPOJ GNYR09F 数字上的找规律DP
Problem C SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的 ...
- bzoj3875 【Ahoi2014】骑士游戏 spfa处理后效性动规
骑士游戏 [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,JYY一共有两种攻 ...
- CodeForces - 462B Appleman and Card Game
是一道简单题 将字母从个数多到小排序 然后 再按题目算法得到最多 但是注意 数据类型声明 money要为long long #include <iostream> #include < ...
- 【ZJOI2017 Round1练习】D2T3 counter(线段树)
题意: 思路: 预处理出b[i]代表i位置之前比a[i]小的数的个数 以每个数为结尾的组数是线段树中(1,a[i]-1) 对于a[i]换到最后,相当于线段树中(a[i]+1,n)-- 交换后b[i]又 ...
- nagios+logstash实时监控java日志(一)
https://blog.csdn.net/yanggd1987/article/details/64121459
- js如何获取一个object的第一个数据
var obj = { "1":"123", "2":"456" } console.info( obj[Object. ...
- Mac BOOK PRO U盘安装windows7、8及8.1
http://v.youku.com/v_show/id_XMTI1NjgzMzU0NA==.html http://jingyan.baidu.com/article/1709ad80b3d2f44 ...