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 |
为什么我离散化还TLE,讨论里的数据我都能过,但是就是TLE,求神牛help!!线段树+离散化,就是TLE,请求帮助。 从后往前处理每个海报,如果贴上就记录,并ans++。 type node=record l,r,lc,rc,z:longint; end; node2=record num,belong:longint; end; var tree:array[0..20001] of node; post:array[1..10000,0..1] of longint; po:array[0..20001] of node2; i,j,k,n,p,ans,x,t,tt:longint; quit:boolean; procedure qsort(l,r:longint); var i,j,x:longint; t:node2; begin i:=l; j:=r; x:=po[random(r-l)+l].num; repeat while po[i].num<x do inc(i); while po[j].num>x do dec(j); if i<=j then begin t:=po[i]; po[i]:=po[j]; po[j]:=t; inc(i); dec(j); end; until i>j; if i<r then qsort(i,r); if j>l then qsort(l,j); end; procedure build(var t:longint; l,r:longint); begin inc(tt); t:=tt; tree[t].l:=l; tree[t].r:=r; tree[t].z:=0; if l<r then begin build(tree[t].lc,l,(l+r)>>1); build(tree[t].rc,(l+r)>>1+1,r); end; end; procedure insert(var t:longint;l,r:longint); begin if t=0 then exit; if tree[t].z>0 then exit; if tree[t].z=-1 then begin if tree[tree[t].lc].r>=r then insert(tree[t].lc,l,r) else if tree[tree[t].rc].l<=l then insert(tree[t].rc,l,r) else begin insert(tree[t].lc,l,tree[tree[t].lc].r); insert(tree[t].rc,tree[tree[t].rc].l,r); end; exit; end; if (tree[t].l=l) and (tree[t].r=r) then begin quit:=true; tree[t].z:=i; end else begin tree[t].z:=-1; if tree[tree[t].lc].r>=r then insert(tree[t].lc,l,r) else if tree[tree[t].rc].l<=l then insert(tree[t].rc,l,r) else begin insert(tree[t].lc,l,tree[tree[t].lc].r); insert(tree[t].rc,tree[tree[t].rc].l,r); end; end; end; procedure main; begin readln(n); po[0].num:=0; for i:=1 to n do begin readln(post[i][0],post[i][1]); po[i+i-1].num:=post[i][0]; po[i+i-1].belong:=i; po[i+i].num:=post[i][1]; po[i+i].belong:=-i end; qsort(1,n+n); p:=0; for i:=1 to n+n do begin if po[i].num<>po[i-1].num then inc(p); x:=po[i].belong; if x>0 then post[x,0]:=p else post[-x,1]:=p; end; //prepare finsih t:=0; tt:=0; ans:=0; build(t,1,p); for i:=n downto 1 do begin quit:=false; insert(t,post[i][0],post[i][1]); if quit then inc(ans); end; writeln(ans); end; begin randomize; readln(k); for j:=1 to k do main; end. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator