前言

为什么随机跳题会跳到这种题目啊?

Solution

我们发现可以把这个东西分情况讨论:
1.这个点没有加倍

  • 这一段相同的可以看成一个点,然后后面的都可以。
  • 这一段看成一个点,然后前面的不能对他造成影响的都可以。

2.这个点加倍了

  • 这一段相同的看做一个点,然后前面的都可以
  • 这一段相同的看成一个点,然后后面的如果对他的排名有影响,一定要加倍。

剩下的用组合数随便乱算一下就好了。

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=100010,Mod=998244353;
struct node{int id,val;};
bool cmp(node a,node b){return a.val<b.val;}
node a[N];
int jc[N],jcn[N],inv[N],n,k,ans[N],pre[N],last;
int C(int n,int m){
    if(n<0 || m<0 || n<m)return 0;
    return (ll)jc[n]*jcn[m]%Mod*jcn[n-m]%Mod;
}
void init(){
    jc[0]=jcn[0]=inv[1]=1;
    for(int i=1;i<=n;i++)jc[i]=(ll)jc[i-1]*i%Mod;
    for(int i=2;i<=n;i++)inv[i]=(ll)(Mod-Mod/i)*inv[Mod%i]%Mod;
    for(int i=1;i<=n;i++)jcn[i]=(ll)jcn[i-1]*inv[i]%Mod;
}
int main(){
    n=gi();k=gi();
    for(int i=1;i<=n;i++)a[i].val=gi(),a[i].id=i;
    init();
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        if(a[last].val!=a[i].val)last=i;
        pre[i]=last;
    }
    for(int i=1;i<=n;i++){
        int tmp=i;
        int now=a[tmp].id,have;i=pre[i];
        have=n-i;
        int l=1,r=i-1,wh=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(a[mid].val*2>=a[i].val){wh=mid;r=mid-1;}
            else l=mid+1;
        }
        have+=i-1;
        if(wh)have-=i-wh;
        ans[now]=C(have,k);
        have=i-1;int K=k-1;
        l=1,r=n;wh=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(a[mid].val<a[i].val*2){wh=mid;l=mid+1;}
            else r=mid-1;
        }
        if(!wh)have+=n-i;
        else{K=K-wh+i;have+=n-wh;}
        ans[now]=(ans[now]+C(have,K))%Mod;
        i=tmp;
    }
    for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
    return 0;
}

「PKUSC2018」真实排名(排列组合,数学)的更多相关文章

  1. 「PKUSC2018」真实排名(组合)

    一道不错的组合数问题! 分两类讨论: 1.\(a_i\) 没有翻倍,那些 \(\geq a_i\) 和 \(a_j\times 2<a_i\) 的数就没有影响了.设 \(kth\) 为 \(a_ ...

  2. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  3. 【LOJ】#6432. 「PKUSC2018」真实排名

    题解 简单分析一下,如果这个选手成绩是0,直接输出\(\binom{n}{k}\) 如果这个选手的成绩没有被翻倍,那么找到大于等于它的数(除了它自己)有a个,翻倍后不大于它的数有b个,那么就从这\(a ...

  4. 「PKUSC2018」真实排名

    题面 题解 因为操作为将一些数字翻倍, 所以对于一个数\(x\), 能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\) 将选手的成绩排序,然后考虑当前点的方案 1. ...

  5. LOJ #6432. 「PKUSC2018」真实排名

    题目在这里...... 对于这道题,现场我写炸了......谁跟我说组合数O(n)的求是最快的?(~!@#¥¥%……& #include <cstdio> #include < ...

  6. Loj 6432. 「PKUSC2018」真实排名 (组合数)

    题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < ...

  7. #6432. 「PKUSC2018」真实排名(组合数学)

    题面 传送门 题解 这数据范围--这输出大小--这模数--太有迷惑性了-- 首先对于\(0\)来说,不管怎么选它们的排名都不会变,这个先特判掉 对于一个\(a_i\)来说,如果它不选,那么所有大于等于 ...

  8. Loj#6432「PKUSC2018」真实排名(二分查找+组合数)

    题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...

  9. LOJ 6432 「PKUSC2018」真实排名——水题

    题目:https://loj.ac/problem/6432 如果不选自己,设自己的值是 x ,需要让 “ a<x && 2*a>=x ” 的非 x 的值不被选:如果选自己 ...

随机推荐

  1. 之前的一些Oracle的经验总结

    1. 安装: 1) 关于字符集的选择,现在还不很了解,修改是需要进入一个模式下才可以修改,当然新建一个数据库实例的时候可以重新设定: UTF8是相对比较大的一个字符集, 可以简单实用这个就能保存很多的 ...

  2. Flex 确定弹出窗口的绝对位置x , y

    var selectbox:Selectbox; selectbox = new SelectBox(); var pt:Point = new Point(0,0); pt = this.paren ...

  3. dfs序理解-hdu3887

    dfs序就是相当于把树转化成了一个区间,在区间上进行操作. void dfs(int u, int fa) { l[u]=++key; ; i=e[i].next) { int v=e[i].v; i ...

  4. one or more

    想到以后如果一直都是这样,那么以后的生活是多么多么可怕啊. 感觉毫无期盼.没有意义. 如果变得理所当然那是多么多么让人害怕的事,吓得让人发抖. 所以在以后漫长的岁月里,还是一个人吧 如果相互看不惯,感 ...

  5. Linux运维之shell脚本

    一.bash漏洞 1)bash漏洞 bash漏洞是控制Linux计算机命令提示符的软件中存在的漏洞. bash是一个为GNU计划编写的Unix shell.它的名字是一系列缩写:Bourne-Agai ...

  6. python学习 day5 (3月6日)

    字典映射,{}键值对,key 唯一的 ,可哈希,容器型数据类型 可变的(不可哈希): 字典 列表 集合 都不可做键 不可变的(可哈希): 数字 字符串 bool 元组 frozeset() 可以做键 ...

  7. 20175316盛茂淞-Java第1周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java入门 1.Java简介(地位,特点) 2.安装JDK,设置系统环境 3.编译J ...

  8. 783. Minimum Distance Between BST Node

    方法一,非递归方法,中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *l ...

  9. PCA图

    R语言PCA 1.关键点 综述:主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据降维处理的从数据中提取某些公共部分,然后对这些公共部分进行分析和处理. #主成分分析 是将多指标化为 ...

  10. MFC控件Slider Control的使用

    写MFC界面程序时,今天恰好用到Slider控件,做一个小小的记录. 步骤 1.在工具栏中添加Slider Control控件: 2.在控件上右键->添加变量(Add Variable...), ...