Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

【坑】线段数过不了的可以看一下这个。说点树过不了的也可以进来看一下。

Posted by liusicong at 2014-10-12 11:20:34 on Problem 2528
这个题还有一个坑,就是【海报贴的是一个个的区间】。  
可以把每个区间抽象成一个点,然后建立点数。  离散化之后就可以直接做了。
如果是建立区间树的话,要把输入的左界减一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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator