「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 的值不被选:如果选自己 ...
随机推荐
- 转:java 委托
委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...
- UIWebView如何加载本地图片
UIWebView如何加载本地图片 UIWebView加载本地图片是有实用价值的.比方说,有时候我们需要本地加载静态页来显示相关帮助信息,而这些帮助信息当中含有很多很多的富文本,用代码实现难度较大,这 ...
- [UI] 精美UI界面欣赏[5]
精美UI界面欣赏[5]
- Python常见报错问题(不定时更新)
1.TabError: inconsistent use of tabs and spaces in indentation 在缩进中不一致地使用tab键和空格键. 报错原因:混用了tab和space ...
- 一、CSS概述 二、CSS的选择器(认识) 三、CSS样式和属性(练习) 四、重构商城首页DIV+CSS(页面布局)(重点) 浮动/更改显示方式
一.CSS概述###<1>概念 DIV,就是一个HTML元素,块级元素,通常结合CSS进行页面的布局. CSS,层叠样式表,给HTML元素增强显示. ###<2>作用 样式定义 ...
- 1. 安装Oracle,配置环境 2. 实现查询From子句 3. 实现查询where子句 4. 实现查询order by子句
一.环境安装1. 登录:以管理员身份登录 sqlplus 登录名/密码 管理员身份登录:sqlplus system/1234562. 登录后,导入案例.下载scott.sql文件,执行下面一行的命令 ...
- Gsoap在QT工程里如何调用
Qt并没有SOAP的官方实现,都是借助三方库来实现,不过似乎有个QtSoap,不过这个不是太会用,所以还是用Gsoap 这里生成纯C文件, 1.下载gSOAP(http://sourceforge.n ...
- 洛谷 P4011 孤岛营救问题【最短路+分层图】
题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...
- 1070. [SCOI2007]修车【费用流】
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- c# datetime用法总结
备忘:YYYY-mm-dd HH:MM:SS部分解释 d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ddd 周中某天的缩写名称,在 Abbreviated ...