hdu5036 线段树(dfs序使树形结构转化为线性结构)(map,pair)

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<string>
  4 #include<algorithm>
  5 #include<map>
  6 using namespace std;
  7 map<string,int>mp;
  8 pair<int,int>egd[120005];
  9 int y1,y2,time_,now;
 10 int next[120005],head[120005],point[120005],val[120005];
 11 int vis[120005],left_[120005],right_[120005],setv[120005],sumv[120005],sum[120005];
 12 void addadge(int u,int v,int d)
 13 {
 14     next[++now]=head[u];
 15     head[u]=now;
 16     point[now]=v;
 17     val[now]=d;
 18 }
 19 void dfs(int k,int v)
 20 {
 21     int i,u;
 22     vis[k]=1; time_++;
 23     sum[time_]=v;  left_[k]=time_;
 24     for (i=head[k];i!=-1;i=next[i])
 25     {
 26         u=point[i];
 27         if (!vis[u]) dfs(u,v^val[i]);
 28     }
 29     right_[k]=time_;
 30 }
 31 void build(int o,int l,int r)
 32 {
 33     int lc=o*2,rc=o*2+1;
 34     setv[o]=0;
 35     if (l==r) {sumv[o]=sum[l]; return;}
 36     int mid=l+(r-l)/2;
 37     build(lc,l,mid); build(rc,mid+1,r);
 38     sumv[o]=sumv[lc]+sumv[rc];
 39     return;
 40 }
 41 void update(int o,int l,int r)
 42 {
 43     int lc=o*2,rc=o*2+1,mid=l+(r-l)/2;
 44     if (y1<=l&&y2>=r) {
 45         setv[o]^=1;
 46         sumv[o]=r-l+1-sumv[o];
 47         return;
 48     }
 49     if (setv[o]>=1)
 50     {
 51         setv[lc]^=1; setv[rc]^=1;
 52         sumv[lc]=mid-l+1-sumv[lc];
 53         sumv[rc]=r-mid-sumv[rc];
 54         setv[o]=0;
 55     }
 56     if (y1<=mid) update(lc,l,mid);
 57     if (y2>mid) update(rc,mid+1,r);
 58     sumv[o]=sumv[lc]+sumv[rc];
 59 }
 60 int main()
 61 {
 62     int T,t,d,i,n,u,v,q;
 63     char s1[15],s2[15],c;
 64     scanf("%d",&T);
 65     for (t=1;t<=T;t++)
 66     {
 67         mp.clear();
 68         memset(head,-1,sizeof(head));
 69         memset(vis,0,sizeof(vis));
 70         now=0; time_=0;
 71         scanf("%d",&n);
 72         for (i=1;i<=n;i++)
 73         {
 74             scanf("%s",s1);
 75             mp[(string)s1]=i;
 76         }
 77         for (i=1;i<n;i++)
 78         {
 79             scanf("%s%s%d",s1,s2,&d);
 80             u=mp[(string)s1]; v=mp[(string)s2];
 81             addadge(u,v,d);
 82            addadge(v,u,d);
 83             egd[i]=make_pair(u,v);
 84         }
 85         dfs(1,0);
 86         scanf("%d",&q);
 87         printf("Case #%d:\n",t);
 88         build(1,1,n);
 89         while (q--)
 90         {
 91             getchar();
 92             scanf("%c",&c);
 93             if (c=='Q') printf("%d\n",sumv[1]*(n-sumv[1])*2);
 94             else
 95             {
 96                 scanf("%d",&d);
 97                 u=egd[d].first; v=egd[d].second;
 98                 if (left_[u]>left_[v]) {d=u; u=v; v=d; }
 99                 y1=left_[v]; y2=right_[v];
100                 update(1,1,n);
101             }
102         }
103     }
104     return 0;
105 }

http://acm.hdu.edu.cn/showproblem.php?pid=5039

posted on 2014-09-25 20:58  xiao_xin  阅读(222)  评论(0编辑  收藏  举报

导航