Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用 treap wrong 了 怎么回事 help help!!!!! (附代码)用 treap wrong 了 怎么回事 help help!!!!! Var i,j,n,m,st,en,root,sonnum:Longint; x,y,k,a,ran,lson,rson,lnum,rnum: array[0..300000] of Longint; ans,mark:array[1..300000] of Longint; function max(c,d:Longint):Longint; begin if c>d then max:=c else max:=d; end; function min(c,d:Longint):Longint; begin if c>d then min:=d else min:=c; end; procedure swap(var c,d:Longint); var t:Longint; begin t:=c;c:=d;d:=t; end; procedure fast(f,l:Longint); var f1,l1,mid:Longint; begin f1:=f;l1:=l;mid:=x[(f+l) div 2]; repeat while x[f1]<mid do inc(f1); while x[l1]>mid do dec(l1); if f1<=l1 then begin swap(x[f1],x[l1]); swap(y[f1],y[l1]); swap(k[f1],k[l1]); swap(mark[f1],mark[l1]); inc(f1);dec(l1); end; until f1>l1; if f1<l then fast(f1,l); if f<l1 then fast(f,l1); end; Function left(point:Longint):Longint; var t:Longint; begin left:=lson[point]; t:=rson[lson[point]];lnum[point]:=rnum[lson[point]]; rson[lson[point]]:=point; rnum[lson[point]]:=lnum[point]+rnum[point]+1; lson[point]:=t; end; Function right(point:Longint):Longint; var t:Longint; begin right:=rson[point]; t:=lson[rson[point]];rnum[point]:=lnum[rson[point]]; lson[rson[point]]:=point; lnum[rson[point]]:=rnum[point]+lnum[point]+1; rson[point]:=t; end; function ins(point:Longint):Longint; begin if point=0 then begin ins:=j;exit; end; ins:=point; if a[j]<a[point] then begin inc(lnum[point]); lson[point]:=ins(lson[point]); if ran[point]<ran[lson[point]] then ins:=left(point); end else begin inc(rnum[point]); rson[point]:=ins(rson[point]); if ran[point]<ran[rson[point]] then ins:=right(point); end; end; function del(point:Longint):Longint; begin if (lson[point]=0) and (rson[point]=0) then begin del:=0;exit; end; if a[j]<a[point] then begin lson[point]:=del(lson[point]);del:=point;dec(lnum[point]); end else if (a[j]>=a[point]) and (j<>point) then begin rson[point]:=del(rson[point]);del:=point;dec(rnum[point]); end else begin if ran[lson[point]]>ran[rson[point]] then begin point:=left(point);dec(rnum[point]); rson[point]:=del(rson[point]);del:=point; end else begin point:=right(point);dec(lnum[point]); lson[point]:=del(lson[point]);del:=point; end; end; end; procedure find(point:Longint); begin if sonnum+lnum[point]=k[i] then begin ans[mark[i]]:=a[point];exit; end; if sonnum+lnum[point]>k[i] then find(lson[point]) else begin sonnum:=sonnum+lnum[point]+1; find(rson[point]); end; end; Begin randomize; readln(n,m); for i:=1 to n do read(a[i]); readln; for i:=1 to m do begin readln(x[i],y[i],k[i]);mark[i]:=i; end; fast(1,m); x[0]:=x[1];y[0]:=0;root:=0; for i:=1 to m do begin dec(k[i]); en:=min(y[i-1],x[i]-1); for j:=x[i-1] to en do root:=del(root); st:=max(x[i],y[i-1]+1); for j:=st to y[i] do begin ran[j]:=random(1990724); if root=0 then root:=j else root:=ins(root); end; sonnum:=0; find(root); end; for i:=1 to m do writeln(ans[i]); End. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator