Olympiad in Informatics Beginners' Home's Archiver

qswb 发表于 2008-11-19 02:05 PM

pku3321 apple tree

为什么总是wa?树状数组貌似对啊
var n,i,j,k,l:longint;
    ss,sss:string;
    ch:char;
    f:array[1..100000] of boolean;
    tree,be,en:array[1..100000] of longint;
    a:array[1..100000,1..2] of longint;
procedure dfs(const x:longint);
var ii:longint;
begin
inc(l);
f[x]:=true;
be[x]:=l;
ii:=a[x,2];
while ii<>0 do
  begin
   if not f[ii] then dfs(ii);
   ii:=a[ii,1];
  end;
en[x]:=l;
end;
procedure change(const x,y:longint);
var ii:longint;
begin
ii:=x;
while ii<=n do
  begin
   inc(tree[ii],y);
   ii:=ii+ii and -ii;
  end;
end;
function sum(const x:longint):longint;
var ii,s:longint;
begin
ii:=x;
s:=0;
while ii>0 do
  begin
   inc(s,tree[ii]);
   ii:=ii-ii and -ii;
  end;
exit(s);
end;
begin
readln(n);
fillchar(a,sizeof(a),0);
for i:=1 to n-1 do
  begin
   readln(j,k);
   if a[j,2]=0
    then a[j,2]:=k
    else begin
          l:=a[j,2];
          while a[l,1]<>0 do l:=a[l,1];
          a[l,1]:=k;
         end;
   if a[k,2]=0
    then a[k,2]:=j
    else begin
          l:=a[k,2];
          while a[l,1]<>0 do l:=a[l,1];
          a[l,1]:=j;
         end;
  end;
fillchar(f,sizeof(f),0);
l:=0;
dfs(1);
readln(n);
fillchar(f,sizeof(f),1);
for i:=1 to n do
  begin
   read(ch);
   readln(j);
   if ch='Q'
    then writeln(en[j]-be[j]+1+sum(en[j])-sum(be[j]-1))
    else begin
          if f[j]
           then change(be[j],-1)
           else change(be[j],1);
          f[j]:=not f[j];
         end;
  end;
end.

faintzw 发表于 2008-11-19 02:10 PM

树状数组当然对。。写错了就是了

qswb 发表于 2008-11-19 02:11 PM

你看看哪写错了啊
貌似对啊

faintzw 发表于 2008-11-19 02:28 PM

[code]
#include<cstdio>
#include<cstring>
const int mn=100010;
struct lnode
{
        int v;
        lnode *nxt;
}*g[mn],pg[mn*2];

int n,m,cnt,xx,ppg,ppt,a[mn],b[mn],s[2*mn];
bool h[mn],vis[mn];
char in[5];

void dfs(int v)
{
        vis[v]=1;
        a[v]=++cnt;
        for(lnode *p=g[v];p;p=p->nxt)
                if(!vis[p->v])dfs(p->v);
        b[v]=++cnt;
}
void modify(int x,int k)
{
        while(x<=cnt)s[x]+=k,x+=x&-x;
}
int query(int x)
{
        if(!x)return 0;
        int ret=0;
        while(x>0)ret+=s[x],x-=x&-x;
        return ret;
}
int main()
{
        scanf("%d",&n);
        for(int i=1,x,y;i<n;i++)
        {
                scanf("%d%d",&x,&y);
                g[x]=&(pg[++ppg]=(lnode){y,g[x]});
                g[y]=&(pg[++ppg]=(lnode){x,g[y]});
        }
        dfs(1);
        memset(h+1,1,n);
        scanf("%d",&m);
        for(int i=1;i<=n;i++)modify(a[i],1);
        while(m--)
        {
                scanf("%s%d",in,&xx);
                if(in[0]=='C')
                {
                        modify(a[xx],h[xx]?-1:1);
                        h[xx]=!h[xx];
                }
                else
                        printf("%d\n",query(b[xx])-query(a[xx]-1));
        }
        return 0;
}
[/code]

自己研究去吧

吴豪 发表于 2008-11-19 05:27 PM

我的题解:
[url=http://fqq11679.blog.hexun.com/22987125_d.html]http://fqq11679.blog.hexun.com/22987125_d.html[/url]
这个题FDU貌似讲过,附上PPT一个。

qswb 发表于 2008-11-20 12:43 PM

奇怪,我方法对啊.............
还是wa.....................
郁闷............................
不做了.........................

页: [1]


Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.