「PKUSC2018」真实排名
题面
题解
因为操作为将一些数字翻倍,
所以对于一个数\(x\),
能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\)
将选手的成绩排序,然后考虑当前点的方案
1. 不翻倍
此时,如果要保证\(x\)的排名不变,那么所有满足\(2y \geq x\)的\(y\)都不能动
设满足\(2y \geq x\)的数有\(\mathrm{Len}\)个,则方案数为\(\binom{n-\mathrm{Len}}{k}\)
2. 翻倍
此时,如果要保证\(x\)的排名不变,那么所有满足\(2x > y\)的\(y\)都要动
设满足\(2x > y\)的数有\(\mathrm{Len}\)个,则方案数为\(\binom{n-\mathrm{Len}}{k-\mathrm{Len}}\)
如果有相同的怎么办???
去重之后,将\(0\)和其他的数字分开处理即可。
代码
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<vector>
#define RG register
#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define clear(x, y) memset(x, y, sizeof(x))
inline int read()
{
int data = 0, w = 1; char ch = getchar();
while(ch != '-' && (!isdigit(ch))) ch = getchar();
if(ch == '-') w = -1, ch = getchar();
while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
}
const int maxn(1e5 + 10), Mod(998244353), N(maxn - 10);
struct node { int val, id, cnt; } A[maxn], B[maxn];
inline bool cmp(const node &lhs, const node &rhs) { return lhs.val < rhs.val; }
int fastpow(int x, int y)
{
int ans = 1;
while(y)
{
if(y & 1) ans = 1ll * ans * x % Mod;
x = 1ll * x * x % Mod, y >>= 1;
}
return ans;
}
int sum[maxn];
int fac[maxn], inv[maxn];
int n, K, ans[maxn], tot;
std::vector<int> S[maxn];
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()
{
fac[0] = inv[0] = 1;
for(RG int i = 1; i <= N; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
inv[N] = fastpow(fac[N], Mod - 2);
for(RG int i = N - 1; i; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % Mod;
n = read(), K = read();
for(RG int i = 1; i <= n; i++) B[i] = (node) {read(), i, 1};
std::sort(B + 1, B + n + 1, cmp); B[0] = (node) {-1, -1, 0};
for(RG int i = 1; i <= n; i++)
if(B[i].val != B[i - 1].val)
{ ++tot; A[tot] = B[i]; S[tot].push_back(B[i].id); }
else ++A[tot].cnt, S[tot].push_back(B[i].id);
for(RG int i = 1; i <= tot; i++)
sum[i] = sum[i - 1] + A[i].cnt;
for(RG int i = 1, R = 1; i <= tot; i++)
{
while(R < tot && A[i].val * 2 > A[R + 1].val) ++R;
int Len = sum[R] - sum[i - 1];
if(A[i].val == 0) Len = sum[R] - sum[i] + 1;
if(Len <= K)
for(RG int j = 0, l = S[i].size(); j < l; j++)
ans[S[i][j]] = (ans[S[i][j]] + C(n - Len, K - Len)) % Mod;
}
for(RG int i = tot, L = tot; i; i--)
{
while(L > 1 && A[L - 1].val * 2 >= A[i].val) --L;
int Len = sum[i - 1] - sum[L - 1] + 1;
for(RG int j = 0, l = S[i].size(); j < l; j++)
ans[S[i][j]] = (ans[S[i][j]] + C(n - Len, K)) % Mod;
}
for(RG int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}
「PKUSC2018」真实排名的更多相关文章
- LOJ #6432. 「PKUSC2018」真实排名(组合数)
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
- 「PKUSC2018」真实排名(排列组合,数学)
前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...
- 「PKUSC2018」真实排名(组合)
一道不错的组合数问题! 分两类讨论: 1.\(a_i\) 没有翻倍,那些 \(\geq a_i\) 和 \(a_j\times 2<a_i\) 的数就没有影响了.设 \(kth\) 为 \(a_ ...
- 【LOJ】#6432. 「PKUSC2018」真实排名
题解 简单分析一下,如果这个选手成绩是0,直接输出\(\binom{n}{k}\) 如果这个选手的成绩没有被翻倍,那么找到大于等于它的数(除了它自己)有a个,翻倍后不大于它的数有b个,那么就从这\(a ...
- LOJ #6432. 「PKUSC2018」真实排名
题目在这里...... 对于这道题,现场我写炸了......谁跟我说组合数O(n)的求是最快的?(~!@#¥¥%……& #include <cstdio> #include < ...
- Loj 6432. 「PKUSC2018」真实排名 (组合数)
题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < ...
- #6432. 「PKUSC2018」真实排名(组合数学)
题面 传送门 题解 这数据范围--这输出大小--这模数--太有迷惑性了-- 首先对于\(0\)来说,不管怎么选它们的排名都不会变,这个先特判掉 对于一个\(a_i\)来说,如果它不选,那么所有大于等于 ...
- Loj#6432「PKUSC2018」真实排名(二分查找+组合数)
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...
- LOJ 6432 「PKUSC2018」真实排名——水题
题目:https://loj.ac/problem/6432 如果不选自己,设自己的值是 x ,需要让 “ a<x && 2*a>=x ” 的非 x 的值不被选:如果选自己 ...
随机推荐
- [控件] LineAnimationView
LineAnimationView 效果 说明 水平循环无间隔播放动画效果,用于loading的界面 源码 https://github.com/YouXianMing/UI-Component-Co ...
- Imagex用法
imagex用来合并/导出wim映像实例 查看wim中包含的所有单个wim实例信息,注意其中的index是唯一的,用来区分不同的wim,导出的时候也通过该index导出相应的wimimagex /in ...
- python操作Exchange邮箱实例(-)
需求很简单,就是实现按公司域名及服务器模拟exchange发送邮件,主要是协助自动化测试.主要功能:收件人/抄送/正文html/附件 本实例基于:python2.7.11 exchangelib1.1 ...
- PHP设计模式系列 - 观察者模式
观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码 ...
- 加密算法--->对称加密与非对称加密算举例说明
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 对称加密例子:des对称加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用 ...
- 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
import java.util.ArrayList; import java.util.Scanner; public class Text { @SuppressWarnings("re ...
- 死磕salt系列-salt文章目录汇总
死磕salt系列-salt入门 死磕salt系列-salt配置文件 死磕salt系列-salt grains pillar 配置 死磕salt系列-salt 常用modules 死磕salt系列-sa ...
- openresty + orange centos7 安装
Orange Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下特性: ...
- Js 中的事件委托/事件代理
什么叫事件委托/事件代理呢 ? JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 事件冒泡: 当事件发生后,这个事件就要开始传 ...
- 《网络安全编程基础》之Socket编程
<网络安全编程基础>之Socket编程 我的代码 server.c // server.cpp : Defines the entry point for the console appl ...