| ||||||||||
| 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 | |||||||||
终于AC了,取二进制中1的个数写错了,以前只统计了第16位……const
MAXTREE = 1 shl 18;
m1 = %01010101010101010101010101010101;
m2 = %00110011001100110011001100110011;
m3 = %00001111000011110000111100001111;
m4 = %00000000111111110000000011111111;
m5 = %00000000000000001111111111111111;
var
flag : array[1..MAXTREE] of byte;
tree : array[1..MAXTREE] of longint;
tmp, A, B, C, T, O, i, base, m, L : longint;
ch : char;
procedure add_new_change(x,c : longint);
begin
if c > 0 then begin
tree[x] := 1 shl c;
flag[x] := c;
end;
end;
procedure refresh_to_son(x : longint);
begin
add_new_change(x shl 1, flag[x]);
add_new_change((x shl 1) or 1, flag[x]);
flag[x] := 0;
end;
procedure refresh_to_leaf(x : longint);
var i : longint;
begin
for i := m downto 1 do
refresh_to_son(x shr i);
end;
function ask(A, B : longint) : longint;
begin
A := (A - 1) or base; B := (B + 1) or base;
refresh_to_leaf(A); refresh_to_leaf(B);
ask := 0;
while B - A > 1 do begin
if A and 1 = 0 then ask := ask or tree[A or 1];
if B and 1 = 1 then ask := ask or tree[B xor 1];
A := A shr 1; B := B shr 1;
end;
ask := (ask and m1) + ((ask shr 1) and m1);
ask := (ask and m2) + ((ask shr 2) and m2);
ask := (ask and m3) + ((ask shr 4) and m3);
ask := (ask and m4) + ((ask shr 8) and m4);
ask := (ask and m5) + ((ask shr 16) and m5);
end;
procedure modify(A, B, C : longint);
var i, l, r, x, y : longint;
begin
A := (A - 1) or base; B := (B + 1) or base;
refresh_to_leaf(A); refresh_to_leaf(B);
l := A; r := B;
while r - l > 1 do begin
if l and 1 = 0 then add_new_change(l or 1, C);
if r and 1 = 1 then add_new_change(r xor 1, C);
l := l shr 1; r := r shr 1;
end;
for i := 1 to m do begin
{Union}
x := A shr i; y := B shr i;
tree[x] := tree[x shl 1] or tree[(x shl 1) or 1];
tree[y] := tree[y shl 1] or tree[(y shl 1) or 1];
end;
end;
begin
// assign(input, '2777.in'); reset(input);
readln(L, T, O);
{Fix L to 2^m - 2}
base := 1; m := 0;
while base < L + 2 do begin
inc(m); base := base shl 1;
end;
filldword(tree, base shl 1, 2); fillchar(flag, base shl 1, 0);
for i := O downto 1 do begin
read(ch);
if ch = 'C' then begin
readln(A, B, C);
if A > B then begin
tmp := A; A := B; B := tmp;
end;
modify(A, B, C);
end
else begin
readln(A, B);
if A > B then begin
tmp := A; A := B; B := tmp;
end;
writeln(ask(A, B));
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