老年选手只会做SB题了(还调了好久)

很容易想到分类讨论,按第\(i\)个人有没有翻倍来算

若\(a_i\)未翻倍,显然此时将\([0,\lceil \frac{a_i}{2}\rceil)\)的数和\([a_i,\infty)\)的数翻倍都可以,记它们的个数为\(x\),则贡献为\(C_x^k\)

若\(a_i\)翻倍了,此时我们要算出\(i\)的排名变化了多少,记为\(dlt\)。然后在\([a_i,2a_i)\)之间的数翻倍之后都是会超过\(2a_i\)的,记为\(x\),因此这部分就是\(C_x^{dlt}\)。

然后此时还剩下\(k-1-dlt\)次操作,显然在\(a_i\)翻倍成\(2a_i\)之后,\([0,a_i)\)与\([2a_i,\infty]\)的数翻不翻倍都不影响答案,记个数为\(y\),贡献还要乘上\(C_y^{k-1-dlt}\)

具体实现的时候可以离散化之后对值等于某个数的所有位置一起讨论

#include<cstdio>
#include<algorithm>
#define RI int
#define CI const int&
using namespace std;
const int N=100005,mod=998244353;
int n,k,a[N],rst[N],pfx[N],suf[N],id[N],ans[N],num,fact[N],inv[N];
inline void inc(int& x,CI y)
{
if ((x+=y)>=mod) x-=mod;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline void init(CI n)
{
RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
for (inv[n]=quick_pow(fact[n]),i=n-1;~i;--i) inv[i]=1LL*inv[i+1]*(i+1)%mod;
}
inline int C(CI n,CI m)
{
if (n<0||m<0) return 0; if (m==0) return 1; if (n<m) return 0;
return 1LL*fact[n]*inv[m]%mod*inv[n-m]%mod;
}
inline int GB(CI x) //>=x
{
return lower_bound(rst+1,rst+num+1,x)-rst;
}
inline int LB(CI x) //<=x
{
return upper_bound(rst+1,rst+num+1,x)-rst-1;
}
int main()
{
RI i; for (scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d",&a[i]),rst[i]=a[i];
rst[n+2]=1e9+1; sort(rst+1,rst+n+3); num=unique(rst+1,rst+n+3)-rst-1;
for (i=1;i<=n;++i) ++pfx[id[i]=GB(a[i])],++suf[id[i]];
for (i=num-1;i;--i) suf[i]+=suf[i+1]; for (i=2;i<=num;++i) pfx[i]+=pfx[i-1];
for (init(n),i=1;i<num;++i)
{
if (!rst[i]) { ans[i]=C(n,k); continue; }
int ls=pfx[LB(rst[i]-1>>1)]; ans[i]=C(suf[i]-1+ls,k);
int c=suf[GB(rst[i]<<1)],dlt=suf[i]-c-1,lt=pfx[LB(rst[i]-1)];
inc(ans[i],1LL*C(pfx[LB((rst[i]<<1)-1)]-lt-1,dlt)*C(c+lt,k-dlt-1)%mod);
}
for (i=1;i<=n;++i) printf("%d\n",ans[id[i]]); return 0;
}

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

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

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

  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. bzoj5368 [Pkusc2018]真实排名

    题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...

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

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

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

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

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

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

随机推荐

  1. 47.QT-QChart之曲线图,饼状图,条形图使用

     1.使用准备 在pro中, 添加QT+= charts 然后在界面头文件中添加头文件并声明命名空间,添加: #include <QtCharts> QT_CHARTS_USE_NAMES ...

  2. swift声明属性为某个类型同时遵循某协议

    swift声明属性为某个类型同时遵循某协议 var instanse:(协议A & 类B)

  3. Andriod安卓下开发UHF读写器

    随着在Andriod设备上使用UHF读写器变得越来越广泛,友我科技独立研发了UHF读写器的android开发包,使用此开发包,工程师只需在工程中导入jar包,使用java语言就可以轻松的开发出Andr ...

  4. 创建以.xxx开头的文件夹的方法

    在windows下创建以.xxx开头的文件夹时,点击确认,系统提示“必须键入文件名”. 最方便的方法: (1)新建文件夹 (3)在文件名.xxxxx后再加一个.,也就是把文件名改成这样子:.XXXXX ...

  5. EasyExcel示例(阿里巴巴)基于Maven

    首先感谢阿里巴巴提供了easyexcel工具类,github地址:https://github.com/alibaba/easyexcel 注意!!这里只是一个简单的示例,VC大法即可使用,对于复杂的 ...

  6. 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法

    知乎上有一个问题是这样的: 堆排序是渐进最优的比较排序算法,达到了O(nlgn)这一下界,而快排有一定的可能性会产生最坏划分,时间复杂度可能为O(n^2),那为什么快排在实际使用中通常优于堆排序? 昨 ...

  7. 【tf.keras】TensorFlow 1.x 到 2.0 的 API 变化

    TensorFlow 2.0 版本将 keras 作为高级 API,对于 keras boy/girl 来说,这就很友好了.tf.keras 从 1.x 版本迁移到 2.0 版本,需要修改几个地方. ...

  8. Object对象方法ES5

    Object.create(proto,propertiesObject)方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. 参数: proto:新创建对象的原型对象. pro ...

  9. 《少年的你》票房被刷爆?让我用python分析一波它好看在哪里!

    最近少年的你刷爆票房,但是是真好看还是假好看,我们也不知道,所以让我们用python来分析一下~ 票房过12亿 两位主演粉丝加起来过亿 电影话题量过亿 豆瓣8.4分, 时光网8.4分, IMDB 7. ...

  10. docker中安装宝塔面板

    我的电脑是win10,安装的virtualbox其上装的ubutun14,ubutun也安装了docker,今天我补充一个完整的操作流程.怎么在docker中安装宝塔面板?先打个岔,这些命令总是记不住 ...