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 |
求救!总是RE归并树,总WA 请问哪位有pascal的标程?C的看着太别扭,有的还不明白…… program pku_2104; type treetype=record lf,rf,left,right:longint; end; treetype2=record left,right,zhi,size:longint; end; var tree:array[0..200005]of treetype;{外边的树} treen:array[0..3400000]of treetype2;{建在外树顶点上的树} root:array[1..100000]of longint;{内部树的根顶点编号} a,b:array[0..100000]of longint; bianh,yings,yong:array[0..100000]of longint;{bianh第i名是第几个数,yings第i个数是第几名} i,j,k,n,m,p,q,r,s,len,lenn,sj,xj:longint; procedure swap(var a,b:longint); var t:longint; begin t:=a; a:=b; b:=t; end; procedure kuaipai(l,r:longint); var i,j,min,x:longint; begin i:=l;j:=r;min:=a[(l+r) div 2]; repeat while a[i]<min do inc(i); while a[j]>min do dec(j); if i<=j then begin swap(a[i],a[j]); swap(bianh[i],bianh[j]); inc(i);dec(j); end; until i>j; if i<r then kuaipai(i,r); if j>l then kuaipai(l,j); end; procedure kuaipai2(l,r:longint); var i,j,min,x:longint; begin i:=l;j:=r;min:=yong[(l+r) div 2]; repeat while yong[i]<min do inc(i); while yong[j]>min do dec(j); if i<=j then begin swap(yong[i],yong[j]); inc(i);dec(j); end; until i>j; if i<r then kuaipai2(i,r); if j>l then kuaipai2(l,j); end; procedure build2(b,e:longint); var t,k:longint; begin t:=(b+e)div 2; inc(lenn); treen[lenn].size:=e-b+1; treen[lenn].zhi:=yong[t]; k:=lenn; if b<e then begin treen[k].left:=lenn+1; build2(b,t); treen[k].right:=lenn+1; build2(t+1,e); end; end; procedure build1(b,e:longint); var t,k:longint; begin t:=(b+e) div 2; inc(len); tree[len].lf:=b; tree[len].rf:=e; root[len]:=lenn+1; for i:=b to e do yong[i]:=yings[i]; kuaipai2(b,e); build2(b,e); k:=len; if b<e then begin tree[k].left:=len+1; build1(b,t); tree[k].right:=len+1; build1(t+1,e); end; end; function find2(j,p:longint):longint; var than,tmp,t:longint; begin tmp:=p; than:=0; while treen[tmp].size<>1 do begin if j>treen[tmp].zhi then begin than:=than+treen[treen[tmp].left].size; tmp:=treen[tmp].right; end else tmp:=treen[tmp].left; end; if j>treen[tmp].zhi then inc(than); find2:=than; end; function find(b,e,j,p:longint):longint; var t,s:longint; begin if (tree[p].lf>=b)and(tree[p].rf<=e) then begin find:=find2(j,root[p]); exit; end; s:=0; t:=(tree[p].lf+tree[p].rf)div 2; if b<=t then s:=s+find(b,e,j,tree[p].left); if e>t then s:=s+find(b,e,j,tree[p].right); find:=s; end; begin assign(input,'pku_2104.in'); assign(output,'pku_2104.out'); reset(input); rewrite(output); readln(n,m); len:=0; lenn:=0; fillchar(treen,sizeof(treen),0); fillchar(tree,sizeof(tree),0); fillchar(root,sizeof(root),0); fillchar(bianh,sizeof(bianh),0); fillchar(yong,sizeof(yong),0); fillchar(yings,sizeof(yings),0); for i:=1 to n do read(a[i]); b:=a; for i:=1 to n do bianh[i]:=i; kuaipai(1,n); for i:=1 to n do yings[bianh[i]]:=i; build1(1,n); for i:=1 to m do begin readln(p,q,r); xj:=1; sj:=n; r:=r-1; while xj<sj-1 do begin j:=(sj+xj)div 2; s:=find(p,q,j,1); {if s=r then break else }if s>r then sj:=j-1 else xj:=j; end; s:=find(p,q,xj+1,1); if (s=r)and(xj=sj-1) then writeln(b[bianh[xj+1]]) else writeln(b[bianh[xj]]); end; close(input); close(output); end. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator