| ||||||||||
| 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