zoukankan      html  css  js  c++  java
  • bzoj 5368: [Pkusc2018]真实排名

    Description

    小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是
    :成绩不小于他的选手的数量(包括他自己)。例如如果3位选手的成绩分别是[1,2,2],那么他们的排名分别是
    [3,2,2]。拥有上帝视角的你知道所有选手的实力,所以在考试前就精准地估计了每个人的成绩,设你估计的第i
    个选手的成绩为Ai,且由于你是上帝视角,所以如果不发生任何意外的话,你估计的成绩就是选手的最终成绩。但
    是在比赛当天发生了不可抗的事故(例如遭受到了外星人的攻击),导致有一些选手的成绩变成了最终成绩的两倍
    ,即便是有上帝视角的你也不知道具体是哪些选手的成绩翻倍了,唯一知道的信息是这样的选手恰好有k个。现在
    你需要计算,经过了不可抗事故后,对于第i位选手,有多少种情况满足他的排名没有改变。由于答案可能过大,
    所以你只需要输出答案对998244353取模的值即可。

    Solution

    分不增大 (i) 和增大 (i) 讨论一下.

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10,mod=998244353;
    int n,K,Fac[N],inv[N],a[N],b[N],ans[N];
    inline int C(int n,int m){
    	if(n<m||n<0||m<0)return 0;
    	return 1ll*Fac[n]*inv[m]%mod*inv[n-m]%mod;
    }
    int main(){
      freopen("pp.in","r",stdin);
      freopen("pp.out","w",stdout);
      cin>>n>>K,Fac[0]=inv[0]=inv[1]=1;
      for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
      for(int i=2;i<=n;i++)inv[i]=(mod-1ll*(mod/i)*inv[mod%i]%mod)%mod;
      for(int i=1;i<=n;i++)Fac[i]=1ll*Fac[i-1]*i%mod,inv[i]=1ll*inv[i]*inv[i-1]%mod;
      int l1=0,l2=0;
      sort(a+1,a+n+1);
      for(int i=1;i<=n;i++){
    	  while(a[l1+1]*2<a[i])++l1;
    	  while(a[l2+1]<a[i])++l2;
    	  int t=lower_bound(a+1,a+n+1,2*a[i])-a-1;
    	  int s=t-(lower_bound(a+1,a+n+1,a[i])-a);
    	  if(s>=0)ans[i]=(C(l1+n-i,K)+C(l2+n-t,K-s-1))%mod;
    	  else ans[i]=C(n,K);
      }
      for(int i=1;i<=n;i++)printf("%d
    ",ans[lower_bound(a+1,a+n+1,b[i])-a]);
      return 0;
    }
    
    
  • 相关阅读:
    [转]ThinkPHP中如何使用原生SQL
    php定时回调接口
    [转]mysql dual虚拟表
    [转]mysql变量使用总结
    [转]使用mysql profiles 来查看sql 语句执行计划
    [转]Mysql中的SQL优化与执行计划
    [转]MySQL单列索引和组合索引的区别介绍
    前端开发框架
    sugar crm
    [转]MCC(移动国家码)和 MNC(移动网络码)
  • 原文地址:https://www.cnblogs.com/Yuzao/p/9306809.html
Copyright © 2011-2022 走看看