problem link
對於每個 \(a_i\) 我們可以考慮這 \(k\) 個選手中要不要有 \(a_i\)
如果沒有的話,那我們就看看有哪些 \(a_j\) 在翻倍後不會影響到 \(a_i\) 的排名
顯然 \(2*a_j或者 \(a_i \le a_j\) 的這些 \(a_j\) 都滿足要求,我們記它們的個數為 \(cnt_1\)
那麼如果這 \(k\) 個中有 \(a_i\) ,那麼我們也要讓 \(a_i\) 翻倍時會影響到的那些 \(a_j\) 也翻個倍,其他就隨便選了
顯然 \(a_i \le a_j < 2*a_i\) 的這些 \(a_j\) 都符合要求,我們記它們的個數為 \(cnt_2\)
計算 \(cnt_1,cnt_2\) 。。。這二分啥的怎麼搞都可以的吧,我這裡直接暴力動態開點權值線段樹,不用離散化,豈不美哉
現在來算答案
第一部分的答案就是那些 \(a_j\) 隨便選 \(k\) 個,也就是 \(c_^k\),\(c\) 為組合數
第二部分:
因為符合要求的 \(cnt_2\) 個選手都得翻個倍,也就是說都得選,如果 \(cnt_2>k\) 當然這部分的答案為 0 了
如果 \(cnt_2 \le k\) 那麼我們就能從剩下的 \(n-cnt_2\) 個選手中隨便挑 \(k-cnt_2\) 個選手,因為他們無論如何都不會影響到 \(a_i\) 的排名
那麼這部分答案就是 \(c_^ ,(cnt_2\le k)\)
注意要特判 \(a_i=0\) 的情況,\(a_i=0\) 的答案是 \(c_n^k\)
那麼最後的答案就是這兩個組合數的和
千萬不要忘記取模!!!
// this code wrote by chtholly_micromaker(micromaker)
#include #define reg register
#define int long long
using namespace std;
const int maxn=100050;
const int p=998244353;
const int maxai=10000050;
template inline void read(t &s)
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
s*=f;
return;
}// int _1;
int mypow[maxn];
int ans[maxn];
int val[maxai],ls[maxai],rs[maxai];
int ndn=1;
int n,k;
int a[maxn];
// int _2;
inline int fastpow(int a,int b)
inline int getc(int n,int m)
inline int query(int u,int l,int r,int ql,int qr)
return 0;
}
BZOJ5368 Pkusc2018 真實排名
time limit 10 sec memory limit 256 mb 小c是某知名比賽的組織者,該比賽一共有n名選手參加,每個選手的成績是乙個非負整數,定義乙個選手的排名是 成績不小於他的選手的數量 包括他自己 例如如果333位選手的成績分別是 1,2,2 那麼他們的排名分別是 3,2,2 擁...
BZOJ5368 Pkusc2018 真實排名
time limit 10 sec memory limit 256 mb submit 163 solved 83 小c是某知名比賽的組織者,該比賽一共有n名選手參加,每個選手的成績是乙個非負整數,定義乙個選手的排名是 成績不小於他的選手的數量 包括他自己 例如如果333位選手的成績分別是 1,2...
BZOJ5368 Pkusc2018 真實排名
description 小c是某知名比賽的組織者,該比賽一共有n名選手參加,每個選手的成績是乙個非負整數,定義乙個選手的排名是 成績不小於他的選手的數量 包括他自己 例如如果3位選手的成績分別是 1,2,2 那麼他們的排名分別是 3,2,2 擁有上帝視角的你知道所有選手的實力,所以在考試前就精準地估...