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:2528 两个注意In Reply To:2528 两个注意 Posted by:Hoblovski at 2013-11-06 16:36:18 program poj2528; type tnode=record col,l,r:longint; end; tline=record l,r,dl,dr:longint; end; var t:array[1..200100] of tnode; line:array[1..100100] of tline; cort:array[1..200100] of longint; flag:array[1..100100] of boolean; n,crt,caseno:longint; (* This is really something ridiculous 'bout my RE *) function min(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; procedure qsortcort(l,r:longint); var i,j:longint; o,k:longint; begin i:=l; j:=r; o:=cort[l+random(r-l+1)]; repeat while cort[i]<o do inc(i); while cort[j]>o do dec(j); if i<=j then begin k:=cort[i]; cort[i]:=cort[j]; cort[j]:=k; inc(i); dec(j); end; until i>j; if i<r then qsortcort(i,r); if j>l then qsortcort(l,j); end; procedure discret; var i,j,k,oc:longint; function binfind(i:longint):longint; var l,r,mid:longint; begin l:=1; r:=crt; while l<>r do begin mid:=(l+r)>>1; if cort[mid]<i then l:=mid+1 else if cort[mid]>i then r:=mid else exit(mid); end; exit(l); end; begin oc:=crt; crt:=1; for i:=2 to oc do if cort[i]<>cort[crt] then begin inc(crt); cort[crt]:=cort[i]; end; for i:=1 to n do with line[i] do begin dl:=binfind(l); dr:=binfind(r); end; end; procedure init; var i,j:longint; begin fillchar(flag,sizeof(flag),0); fillchar(cort,sizeof(cort),0); readln(n); crt:=0; for i:=1 to n do begin with line[i] do readln(l,r); cort[crt+1]:=line[i].l; cort[crt+2]:=line[i].r; inc(crt,2); end; qsortcort(1,crt); discret; end; procedure build(i,il,ir:longint); var mid:longint; begin with t[i] do begin l:=il; r:=ir; col:=0; end; if il<>ir then begin mid:=(il+ir)>>1; build(i<<1,il,mid); build(i<<1+1,mid+1,ir); end; end; procedure update(i:longint); begin if t[i].col>0 then begin t[i<<1].col:=t[i].col; t[i<<1+1].col:=t[i].col; end; end; procedure ins(i,il,ir,ic:longint); var mid:longint; begin update(i); if (t[i].l=il)and(t[i].r=ir) then begin t[i].col:=ic; end else begin mid:=(t[i].l+t[i].r)>>1; if il<=mid then ins(i<<1,il,min(mid,ir),ic); if ir>mid then ins(i<<1+1,max(mid+1,il),ir,ic); update(i<<1); update(i<<1+1); if (t[i<<1].col=-1)or(t[i<<1+1].col=-1) then t[i].col:=-1 else if (t[i<<1].col=0) then t[i].col:=t[i<<1+1].col else if (t[i<<1+1].col=0) then t[i].col:=t[i<<1].col else if t[i<<1].col=t[i<<1+1].col then t[i].col:=t[i<<1].col else t[i].col:=-1; end; end; procedure colour(i:longint); begin if t[i].col>0 then flag[t[i].col]:=true else if t[i].col=-1 then begin colour(i<<1); colour(i<<1+1); end; end; function indepcnt:longint; var i,j:longint; begin j:=0; for i:=1 to n do if flag[i] then inc(j); exit(j); end; procedure work; var i,j,k:longint; begin for i:=1 to n do ins(1,line[i].dl,line[i].dr,i); colour(1); writeln(indepcnt); end; begin readln(caseno); while caseno>0 do begin dec(caseno); init; build(1,1,crt); work; end; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator