讨论 / 求助
cszqwe 2012-03-13 08:25:00
点我顶贴 收藏 删除
{$M 100000000}

{$inline on}

program llx;

var bd,a,b,c,ks,js,pd,b1,b2,first,next:array[1..2000000]of longint;

ch:char;

bs,l,r,xh,i,j,n,m,k,o,p:longint;

procedure try(i:longint);

var j,k:longint;

begin

inc(xh);

ks[i]:=xh;

j:=first[i];

pd[i]:=1;

while j<>0 do

begin

if pd[bd[j]]=0 then

begin

pd[bd[j]]:=1;

try(bd[j]);

end;

j:=next[j];

end;

js[i]:=xh;

end;

procedure paint(i,l,r,ll,lr:longint);

var j,k:longint;

begin

if r<ll then exit;

if l>lr then exit;

if (l>=ll)and(r<=lr) then

begin

a[i]:=1-a[i];

exit;

end;

k:=(l+r)div 2;

if a[i]=1 then

begin

a[2*i]:=1-a[2*i];

a[2*i+1]:=1-a[2*i+1];

a[i]:=0;

end;

paint(i*2,l,k,ll,lr);

paint(i*2+1,k+1,r,ll,lr);

end;

function sum(i,l,r,ll,lr:longint):longint;

var j,k,ans1,ans2:longint;

begin

ans1:=0;

ans2:=0;

sum:=0;

if r<ll then exit;

if l>lr then exit;

if (l>=ll)and(r<=lr)and(a[i]=1) then

begin

sum:=r-l+1;

exit;

end;

k:=(l+r)div 2;

if (l=r) then exit;

if a[i]=1 then

begin

a[2*i]:=1-a[2*i];

a[2*i+1]:=1-a[2*i+1];

a[i]:=0;

end;

ans1:=sum(i*2,l,k,ll,lr);

ans2:=sum(i*2+1,k+1,r,ll,lr);

sum:=ans1+ans2;

end;

begin

readln(n);

for i:=1 to n-1 do

begin

readln(o,p);

inc(bs);

bd[bs]:=p;

k:=first[o];

first[o]:=bs;

next[bs]:=k;

inc(bs);

bd[bs]:=o;

k:=first[p];

first[p]:=bs;

next[bs]:=k;

end;

try(1);

readln(m);

for i:=1 to m do

begin

read(ch);

readln(o);

if ch='C' then

begin

paint(1,1,xh,ks[o],js[o]);

end

else writeln(sum(1,1,xh,ks[o],js[o]));

end;

close(input);

end.

0分……泪奔

求教神犇哪里写次了

#1 594250@2012-03-13 04:38:00
回复 删除
要开个数组记录打结的节点数

也就是不能写sum:=r-l+1;

#2 cszqwe@2012-03-13 08:24:00
回复 删除
回复 沙发594250 的帖子

不对吧,我可是判断了里面的全都打了结才加的,嗯,我再改改试试

#3 cszqwe@2012-03-13 08:25:00
回复 删除
回复 板凳cszqwe 的帖子

谢了,明白哪错了

查看更多回复
提交回复