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 |
【坑】线段数过不了的可以看一下这个。说点树过不了的也可以进来看一下。这个题还有一个坑,就是【海报贴的是一个个的区间】。 可以把每个区间抽象成一个点,然后建立点数。 离散化之后就可以直接做了。 如果是建立区间树的话,要把输入的左界减一OR右界加一。 相比较而言 还是建立点数好做一些。 下面是Pascal的代码,用线段数点数做的,略丑,轻喷。 希望能够帮到你。 Source Code Problem: 2528 User: liusicong Memory: 3284K Time: 94MS Language: Pascal Result: Accepted Source Code program poj2528; const maxn=100000; var t:array[0..maxn*3]of record b,e,c:longint; end; i,m,ans,id,j,k:longint; a:array[0..maxn*2]of longint; l:array[0..maxn]of record x,y:longint; end; v:array[0..maxn]of boolean; procedure qs(l,r:longint); //快排 var i,j,m,t:longint; begin i:=l; j:=r; m:=a[(i+j) div 2]; repeat while a[i]<m do inc(i); while a[j]>m do dec(j); if i<=j then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(i); dec(j); end; until i>j; if l<j then qs(l,j); if i<r then qs(i,r); end; procedure create(root,l,r:longint); //建树 var mid:longint; begin T[root].b:=a[l]; T[root].e:=a[r]; T[root].c:=0; if l=r then exit; mid:=(l+r)div 2; create(root*2,l,mid); create(root*2+1,mid+1,r); //建立点数 end; procedure down(root:longint); //lazy操作 begin if T[root].c>0 then begin T[root*2].c:=T[root].c; T[root*2+1].c:=T[root].c; end; T[root].c:=-1; end; procedure ins(root,x,y,col:longint); //插入 begin if (T[root].b>y)or(T[root].e<x) then exit; if (x<=T[root].b)and(T[root].e<=y) then begin T[root].c:=col; exit; end; down(root); ins(root*2,x,y,col); ins(root*2+1,x,y,col); end; procedure dfs(root:longint); //深搜找总颜色数 begin if T[root].c=0 then exit; if T[root].c>0 then if not v[T[root].c] then begin inc(ans); V[T[root].c]:=true; end; if T[root].c<0 then begin dfs(root*2); dfs(root*2+1); end; end; begin readln(ID); for j:=1 to ID do begin readln(m); fillchar(l,sizeof(l),0); fillchar(a,sizeof(a),0); for i:=1 to m do begin readln(L[i].x,L[i].y); a[i*2-1]:=l[i].x; a[i*2]:=l[i].y; end; qs(1,2*m); a[0]:=a[1]-1; k:=0; for i:=1 to 2*m do if a[i]<>a[i-1] then begin inc(k); a[k]:=a[i]; end; create(1,1,k); for i:=1 to m do ins(1,l[i].x,l[i].y,i); ans:=0; fillchar(v,sizeof(v),0); dfs(1); writeln(ans); end; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator