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

顺便贡献pascal代码一组..

Posted by The_Dawn at 2011-07-12 17:29:07 on Problem 2777
In Reply To:线段树组至少5倍...RE一次 Posted by:The_Dawn at 2011-07-12 17:25:21
type
  node=record
    l,r,c,cover:longint;
  end;

var
  i,j,k,n,m,o,st,ed,color,num,ans:longint;
  tree:array[0..500005]of node;
  ch:char;

procedure swap(var a,b:longint);
  var
    t:longint;
  begin
    t:=a;a:=b;b:=t;
  end;


procedure build(w,l,r:longint);
  var
    mid:longint;
  begin
    tree[w].l:=l;tree[w].r:=r;tree[w].c:=1;tree[w].cover:=1;
    if l>=r then exit;
    mid:=(l+r)shr 1;
    build(2*w,l,mid);
    build(2*w+1,mid+1,r);
  end;

procedure spread(w:longint);
  begin
    tree[w].cover:=0;
    tree[2*w].c:=tree[w].c;
    tree[2*w+1].c:=tree[w].c;
    tree[2*w].cover:=1;
    tree[2*w+1].cover:=1;
  end;

function ask(w:longint):longint;
  var
    mid,tmp:longint;
  begin
    if (st<=tree[w].l)and(tree[w].r<=ed) then exit(tree[w].c);
    if tree[w].cover=1 then spread(w);
    mid:=(tree[w].l+tree[w].r)shr 1;
    tmp:=0;
    if mid>=st then tmp:=tmp or ask(2*w);
    if mid<ed then tmp:=tmp or ask(2*w+1);
    exit(tmp);
  end;

procedure insert(w:longint);
  var
    mid:longint;
  begin
    if (st<=tree[w].l)and(tree[w].r<=ed) then
      begin
        tree[w].cover:=1;
        tree[w].c:=1 shl (color-1);
        exit;
      end;
    if tree[w].cover=1 then spread(w);
    mid:=(tree[w].l+tree[w].r)shr 1;
    if mid>=st then insert(2*w);
    if mid<ed then insert(2*w+1);
    tree[w].c:=tree[2*w].c or tree[2*w+1].c;
  end;

begin
  readln(n,m,o);
  build(1,1,n);
  for i:=1 to o do
    begin
      read(ch);
      case ch of
        'C':begin
              readln(st,ed,color);
              if st>ed then swap(st,ed);
              insert(1);
            end;
        'P':begin
              readln(st,ed);
              if st>ed then swap(st,ed);
              num:=ask(1);
              ans:=0;
              while num<>0 do
                begin
                  if num and 1=1 then inc(ans);
                  num:=num shr 1;
                end;
              writeln(ans);
            end;
      end;
    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