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:求救!总是REIn Reply To:求救!总是RE Posted by:xycking at 2010-02-18 17:26:47 额 > 归并树,总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