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 |
线段树10分钟1A,不过时间好慢。。。type node=record maxl,maxr,maxm,l,r:longint; same:boolean; end; var tree:array [0..400000] of node; a:array [0..100001] of longint; n,m:longint; procedure init; var i:longint; begin read(n); if n=0 then halt; readln(m); for i:=1 to n do read(a[i]); readln; end; function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; procedure updata(var t:node; lt,rt:node); begin t.same:=lt.same and rt.same; if lt.l<>rt.l then t.same:=false; if lt.same and (lt.r=rt.l) then t.maxl:=lt.maxl+rt.maxl else t.maxl:=lt.maxl; if rt.same and (rt.l=lt.r) then t.maxr:=rt.maxr+lt.maxr else t.maxr:=rt.maxr; t.maxm:=max(lt.maxm,rt.maxm); if lt.r=rt.l then t.maxm:=max(t.maxm,lt.maxr+rt.maxl); t.l:=lt.l; t.r:=rt.r; end; procedure buildtree(p,x,y:longint); begin if x=y then begin tree[p].maxl:=1; tree[p].maxr:=1; tree[p].maxm:=1; tree[p].l:=a[x]; tree[p].r:=a[x]; tree[p].same:=true; exit; end; buildtree(p*2,x,(x+y) div 2); buildtree(p*2+1,(x+y) div 2+1,y); updata(tree[p],tree[p*2],tree[p*2+1]); end; function ask(p,x,y,xx,yy:longint):node; var mid:longint; t,lt,rt:node; begin if (x=xx) and (y=yy) then exit(tree[p]); mid:=(x+y) div 2; if yy<=mid then exit(ask(p*2,x,mid,xx,yy)) else if xx>mid then exit(ask(p*2+1,mid+1,y,xx,yy)) else begin lt:=ask(p*2,x,mid,xx,mid); rt:=ask(p*2+1,mid+1,y,mid+1,yy); updata(t,lt,rt); exit(t); end; end; procedure main; var i,x,y:longint; t:node; begin for i:=1 to m do begin readln(x,y); t:=ask(1,1,n,x,y); writeln(t.maxm); end; end; begin while true do begin init; buildtree(1,1,n); main; end; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator