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