P5368 PKUSC2018 真實排名

2022-06-20 06:06:12 字數 1581 閱讀 9757

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 擁有上帝視角的你知道所有選手的實力,所以在考試前就精準地估...