BZOJ 1056 1862 排名系統

2022-04-29 09:06:06 字數 3064 閱讀 8334

排名系統通常要應付三種請求:上傳一條新的得分記錄、查詢某個玩家的當前排名以及返回某個區段內的排名記錄。當某個玩家上傳自己最新的得分記錄時,他原有的得分記錄會被刪除。為了減輕伺服器負擔,在返回某個區段內的排名記錄時,最多返回10條記錄。

第一行是乙個整數n(n>=10)表示請求總數目。接下來n行,每行包含了乙個請求。請求的具體格式如下: +name score 上傳最新得分記錄。name表示玩家名字,由大寫英文本母組成,不超過10個字元。score為最多8位的正整數。 ?name 查詢玩家排名。該玩家的得分記錄必定已經在前面上傳。 ?index 返回自第index名開始的最多10名玩家名字。index必定合法,即不小於1,也不大於當前有記錄的玩家總數。

對於?name格式的請求,應輸出乙個整數表示該玩家當前的排名。對於?index格式的請求,應在一行中依次輸出從第index名開始的最多10名玩家姓名,用乙個空格分隔。

20+adam 1000000 加入adam的得分記錄

+bob 1000000 加入bob的得分記錄

+tom 2000000 加入tom的得分記錄

+cathy 10000000 加入cathy的得分記錄

?tom 輸出tom目前排名

?1 目前有記錄的玩家總數為4,因此應輸出第1名到第4名。

+dam 100000 加入dam的得分記錄

+bob 1200000 更新bob的得分記錄

+adam 900000 更新adam的得分記錄(即使比原來的差)

+frank 12340000 加入frank的得分記錄

+leo 9000000 加入leo的得分記錄

+kaine 9000000 加入kaine的得分記錄

+grace 8000000 加入grace的得分記錄

+walt 9000000 加入walt的得分記錄

+sandy 8000000 加入sandy的得分記錄

+mick 9000000 加入mick的得分記錄

+jack 7320000 加入jack的得分記錄

?2 目前有記錄的玩家總數為12,因此應輸出第2名到第11名。

?5 輸出第5名到第13名。

?kaine 輸出kaine的排名

2cathy tom adam bob

cathy leo kaine walt mick grace sandy jack tom bob

walt mick grace sandy jack tom bob adam dam

4100%資料滿足n<=250000

分析:hash表加上平衡樹,這裡的平衡樹需要支援insert(新增)、delete(刪除)、rank(查詢元素在樹中的排名)和select(找出第k大)。

需要注意的是,如果兩個玩家的得分相同,則比較最後一次更新的時間,而不是加入玩家的時間。

這裡用的是sbt。

1//2

//when i first coded it3//

just god and i could understand it4//

but now5//

just god could6//

78 #include 9 #include 10

11#define hashmod 318931

12#define maxn 318931

1314

intn, sco, len;

15int

prev[hashmod], last[hashmod];

16int

score[hashmod], older[hashmod], num, old;

17int father[maxn], child[maxn][2

];18

intpoint[maxn], size[maxn], cnt, root;

19char str[15], hash_value[hashmod][15

];20

21 inline int hash_insert (int hash, int

value)

2231

32 inline int hash_find (int

hash)

3339

40void rotate (int& f, int

d)41

4950

int newnode (int

p)51

5758

void maintain (int& t, int

d)59

7172 inline bool cmp (int p, int

t)73

7879

void insert (int& t, int

p)8089}

9091

int delete (int& t, int

p)92

else ret =delete (child[t][d], p);

103return

ret;

104}

105106

void delboot (int

p)107

111112 inline void modify (int

hash)

113119

120int rank (int t, int

p)121

128129

int select (int t, int

k)130

136137

intmain ()

138150

if (str[0] == '+'

)151

else

if (str[0] == '?'

)155

else

161170 printf ("\n"

);171

}172

}173

}174 }

bzoj4517 錯排 組合)

求有多少種長度為 n 的序列 a,滿足以下條件 1 n 這 n 個數在序列中各出現了一次 若第 i 個數 a i 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10 9 7 取模。第一行乙個數 t,表示有 t 組資料。接下來 t 行,每行兩個整數 n...

BZOJ4517 排列計數(錯排公式)

從開始看這題到現在,已經過了30多把lol的時間了。話說今天又有一道排列計數的題讓我懵逼。題面題意 問有多少長為n的排列a,恰好有m個位置存在a i i。我們列舉這n m個a i i位置,有cm n 種情況。對於x個數的排列,不存在a i i的方案數設為f x 經過簡單的打表可以發現f i f i ...

BZOJ5368 Pkusc2018 真實排名

time limit 10 sec memory limit 256 mb 小c是某知名比賽的組織者,該比賽一共有n名選手參加,每個選手的成績是乙個非負整數,定義乙個選手的排名是 成績不小於他的選手的數量 包括他自己 例如如果333位選手的成績分別是 1,2,2 那麼他們的排名分別是 3,2,2 擁...