1056: [HAOI2008]排名系统 - BZOJ

Description

排名系统通常要应付三种请求:上传一条新的得分记录、查询某个玩家的当前排名以及返回某个区段内的排名记录。当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除。为了减轻服务器负担,在返回某个区段内的排名记录时,最多返回10条记录。
Input

第一行是一个整数n(n>=10)表示请求总数目。接下来n行,每行包含了一个请求。请求的具体格式如下: +Name Score 上传最新得分记录。Name表示玩家名字,由大写英文字母组成,不超过10个字符。Score为最多8位的正整数。 ?Name 查询玩家排名。该玩家的得分记录必定已经在前面上传。 ?Index 返回自第Index名开始的最多10名玩家名字。Index必定合法,即不小于1,也不大于当前有记录的玩家总数。
Output

对于?Name格式的请求,应输出一个整数表示该玩家当前的排名。对于?Index格式的请求,应在一行中依次输出从第Index名开始的最多10名玩家姓名,用一个空格分隔。
Sample Input
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的排名
Sample Output
2
CATHY TOM ADAM BOB
CATHY LEO KAINE WALT MICK GRACE SANDY JACK TOM BOB
WALT MICK GRACE SANDY JACK TOM BOB ADAM DAM
4



HINT

20%数据满足N<=100 100%数据满足N<=250000

 

唉,splay真的不是很熟练啊

又调了一上午,不过还是有一点收获的,每次发现超时都是因为找答案的方法不够好(当你要l到r的答案时,1.把l到r全部旋到一起 2.把l旋到根然后往右边遍历)

  1 const

  2     maxn=200007;

  3 type

  4     node=record

  5       son:array[0..1]of longint;

  6       size,fa,f,t:longint;

  7       str:string;

  8     end;

  9 var

 10     tree:array[0..maxn*2]of node;

 11     hash,next:array[0..maxn*2]of longint;

 12     n,tot,time,root,k,num:longint;

 13  

 14 function hashx(s:string):longint;

 15 var

 16     i:longint;

 17 begin

 18     hashx:=0;

 19     for i:=1 to length(s) do

 20       hashx:=(hashx*27+ord(s[i])-ord('A'))mod maxn;

 21     inc(hashx);

 22 end;

 23  

 24 function get(s:string):longint;

 25 begin

 26     get:=hashx(s);

 27     while (tree[get].str<>s) and (get<>0) do

 28       get:=next[get];

 29 end;

 30  

 31 procedure rotate(x,w:longint);

 32 var

 33     y:longint;

 34 begin

 35     y:=tree[x].fa;

 36     tree[y].son[w]:=tree[x].son[w xor 1];

 37     if tree[x].son[w xor 1]<>0 then tree[tree[x].son[w xor 1]].fa:=y;

 38     tree[x].son[w xor 1]:=y;

 39     if root=y then root:=x

 40     else

 41       if tree[tree[y].fa].son[0]=y then tree[tree[y].fa].son[0]:=x

 42       else tree[tree[y].fa].son[1]:=x;

 43     tree[x].fa:=tree[y].fa;

 44     tree[y].fa:=x;

 45     with tree[y] do

 46       size:=tree[son[0]].size+1+tree[son[1]].size;

 47 end;

 48  

 49 procedure splay(x,z:longint);

 50 var

 51     y:longint;

 52 begin

 53     while tree[x].fa<>z do

 54       begin

 55         y:=tree[x].fa;

 56         if tree[y].fa=z then

 57           if tree[y].son[0]=x then rotate(x,0)

 58           else rotate(x,1)

 59         else

 60           if tree[tree[y].fa].son[0]=y then

 61             if tree[y].son[0]=x then

 62               begin

 63                 rotate(y,0);

 64                 rotate(x,0);

 65               end

 66             else

 67               begin

 68                 rotate(x,1);

 69                 rotate(x,0);

 70               end

 71           else

 72             if tree[y].son[0]=x then

 73               begin

 74                 rotate(x,0);

 75                 rotate(x,1);

 76               end

 77             else

 78               begin

 79                 rotate(y,1);

 80                 rotate(x,1);

 81               end;

 82       end;

 83     with tree[x] do

 84       size:=tree[son[0]].size+1+tree[son[1]].size;

 85 end;

 86  

 87 procedure delete(x:longint);

 88 var

 89     l,r:longint;

 90 begin

 91     splay(x,0);

 92     l:=tree[x].son[0];

 93     r:=tree[x].son[1];

 94     if (l=0) or (r=0) then

 95       begin

 96         root:=l+r;

 97         tree[l+r].fa:=0;

 98         tree[x].son[0]:=0;

 99         tree[x].son[1]:=0;

100       end

101     else

102       begin

103         while tree[l].son[1]<>0 do

104           l:=tree[l].son[1];

105         while tree[r].son[0]<>0 do

106           r:=tree[r].son[0];

107         splay(l,0);

108         splay(r,l);

109         tree[r].son[0]:=0;

110         dec(tree[r].size);

111         dec(tree[l].size);

112         tree[x].fa:=0;

113       end;

114 end;

115  

116 procedure add(x:longint);

117 var

118     now:longint;

119 begin

120     if root=0 then

121       begin

122         root:=x;

123         tree[x].fa:=0;

124         tree[x].size:=1;

125       end

126     else

127       begin

128         now:=root;

129         while true do

130           begin

131             inc(tree[now].size);

132             if (tree[x].f>tree[now].f) or ((tree[x].f=tree[now].f) and (tree[x].t<tree[now].t)) then

133               if tree[now].son[0]=0 then break

134               else now:=tree[now].son[0]

135             else

136               if tree[now].son[1]=0 then break

137               else now:=tree[now].son[1];

138           end;

139         if (tree[x].f>tree[now].f) or ((tree[x].f=tree[now].f) and (tree[x].t<tree[now].t)) then tree[now].son[0]:=x

140         else tree[now].son[1]:=x;

141         tree[x].size:=1;

142         tree[x].fa:=now;

143       end;

144 splay(x,0);

145 end;

146  

147 procedure insert(s:string;x:longint);

148 var

149     z:longint;

150 begin

151     z:=get(s);

152     if z>0 then

153       begin

154         delete(z);

155         tree[z].t:=time;

156         tree[z].f:=x;

157         add(z);

158       end

159     else

160       begin

161         z:=hashx(s);

162         inc(num);

163         if tree[z].str='' then

164           begin

165             tree[z].str:=s;

166             tree[z].t:=time;

167             tree[z].f:=x;

168             add(z);

169           end

170         else

171           begin

172             while next[z]<>0 do

173               z:=next[z];

174             inc(tot);

175             next[z]:=tot;

176             tree[tot].str:=s;

177             tree[tot].t:=time;

178             tree[tot].f:=x;

179             add(tot);

180           end;

181       end;

182 end;

183  

184 function find(x:longint):longint;

185 var

186     now:longint;

187 begin

188     now:=root;

189     while true do

190       begin

191         if x<=tree[tree[now].son[0]].size then now:=tree[now].son[0]

192         else

193           if x=tree[tree[now].son[0]].size+1 then exit(now)

194           else

195             begin

196               dec(x,tree[tree[now].son[0]].size+1);

197               now:=tree[now].son[1];

198             end;

199       end;

200 end;

201  

202 procedure dfs(now:longint);

203 begin

204     if k=10 then exit;

205     if tree[now].son[0]<>0 then dfs(tree[now].son[0]);

206     if k=10 then exit;

207     inc(k);

208     write(' ',tree[now].str);

209     if k=10 then exit;

210     if tree[now].son[1]<>0 then dfs(tree[now].son[1]);

211 end;

212  

213 function min(x,y:longint):longint;

214 begin

215     if x<y then exit(x);

216     exit(y);

217 end;

218  

219 procedure main;

220 var

221     x:longint;

222     c:char;

223     s:string;

224 begin

225     readln(n);

226     tot:=maxn;

227     for time:=1 to n do

228       begin

229         read(c);

230         if c='+' then

231           begin

232             read(c);

233             s:='';

234             while c<>' ' do

235               begin

236                 s:=s+c;

237                 read(c);

238               end;

239             readln(x);

240             insert(s,x);

241           end

242         else

243           if c='?' then

244           begin

245             readln(s);

246             if (ord(s[1])>=ord('A')) and (ord(s[1])<=ord('Z')) then

247               begin

248                 splay(get(s),0);

249                 writeln(tree[tree[root].son[0]].size+1);

250               end

251             else

252               begin

253                 val(s,x);

254                 splay(find(x),0);

255                 write(tree[root].str);

256                 if num>x then splay(find(min(num,x+9)),root);

257                 k:=1;

258                 if tree[root].son[1]<>0 then dfs(tree[root].son[1]);

259                 writeln;

260               end;

261           end;

262       end;

263 end;

264  

265 begin

266     main;

267 end.
View Code

 

你可能感兴趣的:(2008)