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

给pas的同学一点心得

Posted by zhouzixuan at 2013-01-02 22:10:51 on Problem 2528
离散化,要将右端点加一
type
  node=record
    x,y,l,r,c:longint;
  end;
var
  a:array [1..10000,1..3] of longint;
  b,c:array [0..20000] of longint;
  tree:array [1..80000] of node;
  flag:array [1..10001] of boolean;
  cases,casesth,tot,sum,n,sum1,ans:longint;
procedure init;
var
  i:longint;
begin
  readln(n);
  sum:=0; tot:=0; ans:=0;
  fillchar(flag,sizeof(flag),false);
  for i:=1 to n do
  begin
    readln(a[i,1],a[i,2]); inc(a[i,2]);
    inc(sum); b[sum]:=a[i,1];
    inc(sum); b[sum]:=a[i,2];
    a[i,3]:=i+1;
  end;
end;
procedure qsort(x,y:longint);
var
  p,q,mid:longint;
begin
  p:=x;
  q:=y;
  mid:=b[(x+y) div 2];
  repeat
    while b[x]<mid do inc(x);
    while b[y]>mid do dec(y);
    if x<=y then
    begin
      b[0]:=b[x];
      b[x]:=b[y];
      b[y]:=b[0];
      inc(x);
      dec(y);
    end;
  until x>y;
  if p<y then qsort(p,y);
  if x<q then qsort(x,q);
end;
procedure cut_repeat;
var
  i,j,k:longint;
begin
  sum1:=0;
  for i:=1 to sum do
  if b[i]<>b[i-1] then
  begin
    inc(sum1);
    c[sum1]:=b[i];
  end;
  sum:=sum1;
end;
function two_find(x:longint):longint;
var
  l,r,mid:longint;
begin
  l:=1; r:=sum;
  while l<=r do
  begin
    mid:=(l+r) div 2;
    if c[mid]=x then exit(mid);
    if c[mid]<x then l:=mid+1
    else r:=mid-1;
  end;
end;
procedure divided;
var
  i,j:longint;
begin
  for i:=1 to n do
  begin
    j:=two_find(a[i,1]); a[i,1]:=j;
    j:=two_find(a[i,2]); a[i,2]:=j;
  end;
end;
procedure buildtree(x,y:longint);
var
  i:longint;
begin
  inc(tot);
  i:=tot;
  tree[i].x:=x;
  tree[i].y:=y;
  tree[i].c:=1;
  if x+1=y then exit;
  tree[i].l:=tot+1;
  buildtree(x,(x+y) div 2);
  tree[i].r:=tot+1;
  buildtree((x+y) div 2,y);
end;
procedure change(p,x,y,c:longint);
var
  mid:longint;
begin
  if tree[p].x+1=tree[p].y then begin tree[p].c:=c; exit; end;
  if (x=tree[p].x) and (y=tree[p].y) then begin tree[p].c:=c; exit; end;
  if tree[p].c>0 then
  begin
    tree[tree[p].l].c:=tree[p].c;
    tree[tree[p].r].c:=tree[p].c;
    tree[p].c:=-1;
  end;
  mid:=(tree[p].x+tree[p].y) div 2;
  if x>=mid then change(tree[p].r,x,y,c)
  else if y<=mid then change(tree[p].l,x,y,c)
  else
  begin
    change(tree[p].l,x,mid,c);
    change(tree[p].r,mid,y,c);
  end;
end;
procedure main;
var
  i,j:longint;
begin
  for i:=1 to n do change(1,a[i,1],a[i,2],a[i,3]);
end;
procedure count(p:longint);
begin
  if tree[p].c>0 then
  begin
    flag[tree[p].c]:=true;
    exit;
  end;
  count(tree[p].l);
  count(tree[p].r);
end;
procedure print;
var
  i:longint;
begin
  for i:=2 to n+1 do
  if flag[i] then inc(ans);
  writeln(ans);
end;
begin
  readln(cases);
  for casesth:=1 to cases do
  begin
    init;
    qsort(1,sum);
    cut_repeat;
    divided;
    buildtree(1,sum);
    main;
    count(1);
    print;
  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