UOJ Logo zhangzhiyang的博客

博客

第五场第一题树

2017-10-10 20:27:11 By zhangzhiyang

我用了一个st表记录bfs上的时间戳,每次找区间中最小的那个为根,然后递归的建树。。。为什么st表要开到60w才能过呢???附上代码program aaaa;

var a,lg:array[0..600300] of longint; f:array[0..600300,0..30] of longint; n,i,j:longint;

function min(xa,xb:longint):longint; begin if xa<xb then exit(xa) else exit(xb); end;

function query(xa,xb:longint):longint; var len:longint; begin len:=lg[xb-xa+1]; exit(min(f[xa,len],f[xb-(1 shl len)+1,len])); end;

procedure work(l,r:longint); var now:longint; begin now:=query(l,r); write(a[now],' '); if a[now]>l then work(l,a[now]-1); if a[now]<r then work(a[now]+1,r); end;

begin readln(n); for i:=1 to n do read(a[i]); fillchar(f,sizeof(f),0); for i:=1 to n do f[a[i],0]:=i; lg[1]:=0; for i:=2 to n do if i and (i-1)=0 then lg[i]:=lg[i-1]+1 else lg[i]:=lg[i-1]; for i:=1 to lg[n] do for j:=1 to n do f[j,i]:=min(f[j,i-1],f[j+(1 shl (i-1)),i-1]); work(1,n); end.

oi赛d1t1的问题

2017-09-04 19:45:59 By zhangzhiyang

关于这一题,我的思维是降序排序后,记录两组的和asum和bsum,初始为零,记录两个指针ai,bi初始为1,之后一步步更新答案 1、当两组值相等时,asum+=a[ai],bsum+=b[bi],ai++,bi++同时将抵押加2 2、当asum>bsum,bsum+=b[bi],bi++,将抵押加1 3、当bsum>asum,asum+=a[ai],ai++,将抵押加1 每次用min(aum,bsum)-抵押和答案比较来更新答案 直到ai或bi>n+1 我觉得实质上这个方法与题解是一致的,关于第一步可证明当两边相等时,取一个的结果一定比原来的差,下一步就是取另一个,所以完全可以同时取两个数。。 代码如下 program aaa;

var a,b:array[0..100010] of real; n,i,ai,bi:longint; asum,bsum,sumi,ans:real;

procedure swap(var xa,xb:real); var temp:real; begin temp:=xa; xa:=xb; xb:=temp; end;

procedure qsort1(l,r:longint); var xl,xr:longint; mid:real; begin xl:=l; xr:=r; mid:=a[(l+r) shr 1]; repeat while a[xl]>mid do inc(xl); while a[xr]xr; if xl<r then qsort1(xl,r); if l<xr then qsort1(l,xr); end;

procedure qsort2(l,r:longint); var xl,xr:longint; mid:real; begin xl:=l; xr:=r; mid:=b[(l+r) shr 1]; repeat while b[xl]>mid do inc(xl); while b[xr]xr; if xl<r then qsort2(xl,r); if l<xr then qsort2(l,xr); end;

function min(xa,xb:real):real; begin if xa<xb then exit(xa); end;

begin readln(n); for i:=1 to n do read(a[i]); for i:=1 to n do read(b[i]); qsort1(1,n); qsort2(1,n); ans:=0.0; asum:=0.0; bsum:=0.0; sumi:=0.0; ai:=1; bi:=1; while (ai<=n+1) and (bi<=n+1) do begin if asum<=bsum then begin asum:=asum+a[ai]; inc(ai); sumi:=sumi+1.0;
end else begin bsum:=bsum+b[bi]; inc(bi); sumi:=sumi+1.0; end;

if min(asum,bsum)-sumi>ans then ans:=min(asum,bsum)-sumi; end; write(ans:0:4); end.

但是这份代码怎么都只有5分。。。请教大佬是为什么呢。。

zhangzhiyang Avatar