题面

LOJ #6432. 「PKUSC2018」真实排名

注意排名的定义 , 分数不小于他的选手数量 !!!

题解

有点坑的细节题 ...

思路很简单 , 把每个数分两种情况讨论一下了 .

假设它为 \(x\) .

  1. 不对它进行翻倍操作 :

    那么很容易发现 \(\displaystyle [\lceil \frac{x}{2}\rceil, x)\) 的数都不翻倍 . 其余部分任意 . 假设有 \(tot\) 个 .

    那么这部分答案就是 \(\displaystyle \binom {n-tot - 1} {k}\) .

    \(-1\) 因为它本身不能操作 .

  2. 对它进行翻倍操作 :

    那么又是显然的 , \(\displaystyle [x,2x)\) 的所有数都需要翻倍 . 其余部分任意 . 假设这段有 \(tot\) 个 .

    那么这部分答案就是 \(\displaystyle \binom {n - tot}{k - tot}\) .

然后当 \(x=0\) 的时候需要特殊判断 , 我们可以随意翻倍都不改变结果了 , 答案就是 \(\displaystyle \binom {n} {k}\) .

查询 \([l,r]\) 中数字的个数 , 有个巧妙的操作 . 此处 \(a\) 是排好序的

inline int Sum(int l, int r) {
if (l > r) return 0;
return upper_bound(a + 1, a + 1 + n, r) - lower_bound(a + 1, a + 1 + n, l);
}

以后做这种题一定不能偷懒 , 用脑子想 , 而是要用笔去写 , 把每种情况写清楚了 !!!

那样并不浪费时间 , 反而节省时间 !!

代码

#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std; inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
return x * fh;
} void File() {
#ifdef zjp_shadow
freopen ("6432.in", "r", stdin);
freopen ("6432.out", "w", stdout);
#endif
} const int N = 1e5 + 1e3, Mod = 998244353;
int n, k, a[N], b[N]; typedef long long ll;
ll fac[N], ifac[N]; ll fpm(ll x, ll power) {
ll res = 1; x %= Mod;
for (; power; power >>= 1, (x *= x) %= Mod)
if (power & 1) (res *= x) %= Mod;
return res;
} ll C(int n, int m) {
if (n < 0 || m < 0 || n < m) return 0;
return fac[n] * ifac[m] % Mod * ifac[n - m] % Mod;
} void Init(int maxn) {
fac[0] = ifac[0] = 1;
For (i, 1, maxn) fac[i] = fac[i - 1] * i % Mod;
ifac[maxn] = fpm(fac[maxn], Mod - 2);
Fordown (i, maxn - 1, 1) ifac[i] = ifac[i + 1] * (i + 1) % Mod;
} inline int Sum(int l, int r) {
if (l > r) return 0;
return upper_bound(a + 1, a + 1 + n, r) - lower_bound(a + 1, a + 1 + n, l);
} int main () {
File(); Init(1e5); n = read(); k = read();
For (i, 1, n) a[i] = b[i] = read(); sort(a + 1, a + 1 + n); For (i, 1, n) {
if (!b[i]) { printf ("%lld\n", C(n, k)); continue ; }
ll res = C(n - Sum((b[i] + 1) / 2, b[i] - 1) - 1, k);
int tot = Sum(b[i], b[i] * 2 - 1);
(res += C(n - tot, k - tot)) %= Mod;
printf ("%lld\n", res);
} return 0;
}

LOJ #6432. 「PKUSC2018」真实排名(组合数)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 「PKUSC2018」真实排名(排列组合,数学)

    前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...

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

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

  9. 「PKUSC2018」真实排名

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

随机推荐

  1. sql新语句

    SQL语句查找重复数据的写法:  select partner_id,* from sale_origin where partner_id in (select   partner_id from  ...

  2. Matplotlib 简单图例

    图例参考:http://matplotlib.org/gallery.html API参考:http://matplotlib.org/api/pyplot_summary.html # -*- co ...

  3. Luogu4528 CTSC2008 图腾 树状数组、容斥

    传送门 设$f_i$表示$i$排列的数量,其中$x$表示不确定 那么$$ans=f_{1324}-f_{1432}-f_{1243}=(f_{1x2x}-f_{1423})-(f_{14xx}-f_{ ...

  4. Luogu P2059 [JLOI2013]卡牌游戏

    一道比较简单的概率DP 首先看到这种题目和数据范围,就要毫不犹豫地列DP方程: 我们令\(f_{i,j}\)表示还剩下i个人时编号为j的人的胜率,那么首先我们可以知道边界条件\(f_{1,1}=1\) ...

  5. [Spark][Python]PageRank 程序

    PageRank 程序: file contents: page1 page3page2 page1page4 page1page3 page1page4 page2page3 page4 def c ...

  6. Intel x86_64 Architecture Background 2

    这里是在学习Intel x86_64体系架构时学习到的一些概念,记录下来以供日后参考.如果有错的地方,欢迎指正! CPU上下文切换(context switch): 这个概念第一次听到对我来说是完全陌 ...

  7. ExtJS初探:了解 Ext Core

    Ext Core是一款和jQuery媲美的轻型JS库,基于MIT许可.对于Dom的操作,我个人还是比较喜欢用jQuery.当然如果项目中用的是ExtJS框架,也就没必要多引用一个jQuery,Ext ...

  8. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  9. 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁

    进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...

  10. Linux内核分析 期末总结

    Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...