| ||||||||||
| 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 | |||||||||
Re:AC代码In Reply To:AC代码 Posted by:bigTG at 2014-03-14 22:42:23 > {Memory:7192K
> Time:297MS
> Language:Pascal
> Code Length:1995B}
> program count;
>
> type
> TTree=^Node;
> Node=record
> L,R,col:longint;
> lc,rc:TTree;
> same:boolean; //same的意义在于,same为true则区间为纯色,为false则为混色
> end;
>
> var
> long,O,i,a,b,c:longint;
> T:TTree;
> ch:char;
>
> procedure swap(var a,b:longint);
> var k:longint;
> begin
> k:=a; a:=b; b:=k;
> end;
>
> procedure build(var T:TTree;L,R:longint);
> var mid:longint;
> begin
> new(T);
> T^.L:=L; T^.R:=R;
> T^.lc:=nil; T^.rc:=nil;
> T^.col:=1; T^.same:=true;
> if L<R then
> begin
> mid:=(L+R) shr 1;
> build(T^.lc,L,mid);
> build(T^.rc,mid+1,R);
> end;
> end;
>
> procedure paint(var T:TTree;L,R,c:longint);
> var mid:longint;
> begin
> if (T^.L=L) and (T^.R=R) then
> begin
> T^.same:=true;
> T^.col:=c;
> exit;
> end;
> if T^.same then
> begin
> T^.same:=false;
> T^.lc^.col:=T^.col;
> T^.lc^.same:=true;
> T^.rc^.col:=T^.col;
> T^.rc^.same:=true;
> end;
> mid:=(T^.L+T^.R) shr 1;
> if R<=mid then paint(T^.lc,L,R,c)
> else if L>mid then paint(T^.rc,L,R,c)
> else
> begin
> paint(T^.lc,L,mid,c);
> paint(T^.rc,mid+1,R,c);
> end;
> T^.col:=T^.lc^.col or T^.rc^.col;
> end;
>
> function query(T:TTree;L,R:longint):longint;
> var mid:longint;
> begin
> if T^.same then exit(T^.col);
> if (T^.L=L) and (T^.R=R) then exit(T^.col);
> mid:=(T^.L+T^.R) shr 1;
> if R<=mid then exit(query(T^.lc,L,R))
> else if L>mid then exit(query(T^.rc,L,R))
> else exit(query(T^.lc,L,mid) or query(T^.rc,mid+1,R));
> end;
>
> function count(c:longint):integer;
> var i,x:longint;
> begin
> count:=0;
> x:=1;
> for i:= 1 to 30 do
> begin
> if x and c>0 then inc(count);
> x:=x shl 1;
> end;
> end;
>
> begin
> readln(long,O,O);
> build(T,1,long);
> for i:= 1 to O do
> begin
> read(ch);
> case ch of
> 'C':
> begin
> readln(a,b,c);
> if a>b then swap(a,b); //注意题目说"A may be larger than B"
> paint(T,a,b,1 shl (c-1));
> end;
> 'P':
> begin
> readln(a,b);
> if a>b then swap(a,b);
> writeln(count(query(T,a,b)));
> end;
> end;
> end;
> end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator