BZOJ1984: 月下“毛景树”

1984: 月下“毛景树”

Time Limit: 20 Sec  Memory Limit: 64 MB
Submit: 713  Solved: 245
[Submit][Status]

Description

毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园。 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面,发现树上长着他最爱吃的毛毛果~~~ “毛景树”上有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的。但是这棵“毛景树”有着神奇的魔力,他能改变树枝上毛毛果的个数:  Change k w:将第k条树枝上毛毛果的个数改变为w个。  Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。  Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。 由于毛毛虫很贪,于是他会有如下询问:  Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。

Input

第一行一个正整数N。 接下来N-1行,每行三个正整数Ui,Vi和Wi,第i+1行描述第i条树枝。表示第i条树枝连接节点Ui和节点Vi,树枝上有Wi个毛毛果。 接下来是操作和询问,以“Stop”结束。

Output

对于毛毛虫的每个询问操作,输出一个答案。

Sample Input

4
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop

Sample Output

9
16

【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。

HINT

 

Source

树的分治

题解:

先说点儿题外话

从8点钟开始我打算写树链剖分,因为转c++以来还没有写过。

抱着不好写、写完不好调、线段树不知能不能写对的心态开始写。

写了大概1个多小时写完。

然后就交bzoj,TLE,于是我把hzwer的程序拿过来对拍,写数据生成器又写了20分钟

第一组数据就发现我的程序死循环了,我就一直debug,而我又不会用gdb,

只能输中间结果来看看哪出错了,找到出错的位置又查哪儿导致的出错,调了差不多2个小时竟然发现是dfs1写错了

卧槽!更新fa[x]我竟然写到遍历节点后去了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

改了之后交上去就A了

我以为这题线段树是重点!!!

我以为写完代码读一遍就不会犯sb错误!!!

我以为树链剖分写过好几次了不会写错!!!

我的人生就浪费在debug上了嘛。。。。。。。。。

。。。。。。

题解就不说了,就是因为把边权捆到了点上所以我不得不写LCA,造成一堆麻烦

线段树大概想一想两种运算的优先级和pushdown、pushup放对位置就可以

代码:

1.伤痕累累的代码

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #define inf 1000000000
 12 #define maxn 100000+1000
 13 #define maxm 500+100
 14 #define eps 1e-10
 15 #define ll long long
 16 using namespace std;
 17 struct edge{int go,next,w;}e[2*maxn];
 18 struct seg{int l,r,tag,add,mx;}t[4*maxn];
 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
 20 int fa[maxn][17],dep[maxn],head[maxn],son[maxn],s[maxn];
 21 void ins(int x,int y,int z)
 22 {
 23     e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
 24 } 
 25 void insert(int x,int y,int z)
 26 {
 27     ins(x,y,z);ins(y,x,z);
 28 }
 29 void dfs(int x)
 30 {
 31     s[x]=1;
 32     for(int i=1;i<=16;i++)
 33      if((1<<i)<=dep[x])
 34         fa[x][i]=fa[fa[x][i-1]][i-1];
 35      else break;
 36     for(int y=son[x]=0,i=head[x];i;i=e[i].next)
 37      if(dep[y=e[i].go]==0)
 38      {
 39          dep[y]=dep[x]+1;fa[y][0]=x;dfs(y);
 40          s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
 41      }
 42 }
 43 void dfs2(int x,int chain)
 44 {
 45     p[x]=++cnt;top[x]=chain;
 46     if(son[x])dfs2(son[x],chain);
 47     for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 48      if(y!=fa[x][0]&&y!=son[x])dfs2(y,y);
 49 }
 50 void pushup(int k)
 51 {
 52     t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx);
 53 }
 54 void update1(int k,int x)
 55 {
 56     t[k].tag=x;t[k].add=0;t[k].mx=x;
 57 }
 58 void update2(int k,int x)
 59 {
 60     t[k].add+=x;t[k].mx+=x;
 61 }
 62 void pushdown(int k)
 63 {
 64     if(t[k].tag!=-1)
 65     {
 66         int x=t[k].tag;
 67         update1(k<<1,x);update1(k<<1|1,x);
 68         t[k].tag=-1;
 69     }
 70     if(t[k].add)
 71     {
 72         int x=t[k].add;
 73         update2(k<<1,x);update2(k<<1|1,x);
 74         t[k].add=0;
 75     }
 76 }
 77 void build(int k,int x,int y)
 78 {
 79     int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1;
 80     t[k].tag=-1;t[k].add=0;
 81     if(l==r){t[k].mx=v[l];return;}
 82     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
 83     pushup(k);
 84 }
 85 void cover(int k,int x,int y,int z)
 86 {
 87     //cout<<k<<' '<<x<<' '<<y<<' '<<z<<endl;
 88     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 89     if(l==x&&r==y){update1(k,z);return;}
 90     pushdown(k);
 91     if(y<=mid)cover(k<<1,x,y,z);
 92     else if(x>mid)cover(k<<1|1,x,y,z);
 93     else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z);
 94     pushup(k);
 95 }
 96 void addd(int k,int x,int y,int z)
 97 {
 98     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 99     if(l==x&&r==y){update2(k,z);return;}
100     pushdown(k);
101     if(y<=mid)addd(k<<1,x,y,z);
102     else if(x>mid)addd(k<<1|1,x,y,z);
103     else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z);
104     pushup(k);
105 }
106 int query(int k,int x,int y)
107 {
108     //cout<<k<<' '<<x<<' '<<y<<endl;
109     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
110     if(l==x&&r==y)return t[k].mx;
111     pushdown(k);
112     if(y<=mid)return query(k<<1,x,y);
113     else if(x>mid)return query(k<<1|1,x,y);
114     else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y));
115 }
116 int lca(int x,int y)
117 {
118     //cout<<"!!!!!!!"<<endl;
119     if(dep[x]<dep[y])swap(x,y);//cout<<"!!!!!!!"<<endl;
120     int t=dep[x]-dep[y];
121     for(int i=0;i<=16;i++)
122      if(t&(1<<i))x=fa[x][i];//cout<<"!!!!!!!"<<endl;
123     if(x==y)return x;
124     for(int i=16;i>=0;i--)
125      if(fa[x][i]!=fa[y][i])
126       {x=fa[x][i];y=fa[y][i];};    //cout<<"!!!!!!!"<<endl;
127     return fa[x][0];  
128 }
129 void solveadd(int x,int f,int z)
130 {
131     while(top[x]!=top[f])
132     {
133         addd(1,p[top[x]],p[x],z);
134         x=fa[top[x]][0];
135     }
136     if(f!=x)addd(1,p[f]+1,p[x],z);
137 }
138 void solvecover(int x,int f,int z)
139 {
140     while(top[x]!=top[f])
141     {
142         cover(1,p[top[x]],p[x],z);
143         x=fa[top[x]][0];
144         //cout<<"!!!!!"<<endl;
145     }
146 //    cout<<"!!!!!!"<<endl;
147 //    cout<<f<<' '<<x<<' '<<p[f]<<' '<<p[x]<<endl;
148     if(f!=x)cover(1,p[f]+1,p[x],z);
149 }
150 int solveask(int x,int f)
151 {
152     int ans=0;
153     while(top[x]!=top[f])
154     {
155         //cout<<x<<' '<<top[x]<<' '<<p[x]<<' '<<p[top[x]]<<endl;
156         ans=max(ans,query(1,p[top[x]],p[x]));
157         x=fa[top[x]][0];
158     }
159     if(f!=x)ans=max(ans,query(1,p[f]+1,p[x]));
160     return ans;
161 }
162 int main()
163 {
164     freopen("input.txt","r",stdin);
165     freopen("output.txt","w",stdout);
166     scanf("%d",&n);
167     for(int i=1;i<n;i++)
168     {
169         scanf("%d%d%d",&a[i],&b[i],&c[i]);
170         insert(a[i],b[i],c[i]);
171     }
172     dep[1]=1;
173     dfs(1);
174 //    for(int i=1;i<=n;i++)cout<<i<<' '<<dep[i]<<endl;
175     dfs2(1,1);
176     for(int i=1;i<=n;i++)
177 //    for(int j=0;j<=16;j++)cout<<i<<' '<<j<<' '<<fa[i][j]<<endl;
178 //    for(int i=0;i<=n;i++)cout<<i<<' '<<top[i]<<' '<<p[i]<<' '<<son[i]<<endl;
179     v[1]=0;
180     for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
181     for(int i=1;i<n;i++)v[p[id[i]]]=c[i];
182     //for(int i=1;i<=n;i++)cout<<i<<' '<<v[i]<<' '<<id[i]<<' '<<p[i]<<endl;
183     
184     build(1,1,n);
185     //for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl;
186     char s[10];
187     int x,y,z,f;
188     while(1)
189     {
190         //cout<<"!!!!!!!"<<endl;
191         //for(int k=1;k<=4*n;k++)cout<<t[k].l<<' '<<t[k].r<<' '<<t[k].tag<<' '<<t[k].add<<' '<<t[k].mx<<endl;
192         scanf("%s",s);//cout<<s<<endl;
193         switch(s[1])
194         {
195             case 't':return 0;break;
196             case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
197                      solveadd(x,f,z);solveadd(y,f,z);break;
198             case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
199                      solvecover(x,f,z);solvecover(y,f,z);
200                      break;
201             case 'h':scanf("%d%d",&x,&z);cover(1,p[id[x]],p[id[x]],z);break;
202             case 'a':scanf("%d%d",&x,&y);f=lca(x,y);
203                      printf("%d\n",max(solveask(x,f),solveask(y,f)));
204                      //cout<<solveask(x,f)<<' '<<solveask(y,f)<<endl;
205                      break;
206         }
207     }
208 }
View Code

2.去掉调试

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #define inf 1000000000
 12 #define maxn 100000+1000
 13 #define maxm 500+100
 14 #define eps 1e-10
 15 #define ll long long
 16 using namespace std;
 17 struct edge{int go,next,w;}e[2*maxn];
 18 struct seg{int l,r,tag,add,mx;}t[4*maxn];
 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
 20 int fa[maxn][17],dep[maxn],head[maxn],son[maxn],s[maxn];
 21 void ins(int x,int y,int z)
 22 {
 23     e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
 24 } 
 25 void insert(int x,int y,int z)
 26 {
 27     ins(x,y,z);ins(y,x,z);
 28 }
 29 void dfs(int x)
 30 {
 31     s[x]=1;
 32     for(int i=1;i<=16;i++)
 33      if((1<<i)<=dep[x])
 34         fa[x][i]=fa[fa[x][i-1]][i-1];
 35      else break;
 36     for(int y=son[x]=0,i=head[x];i;i=e[i].next)
 37      if(dep[y=e[i].go]==0)
 38      {
 39          dep[y]=dep[x]+1;fa[y][0]=x;dfs(y);
 40          s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
 41      }
 42 }
 43 void dfs2(int x,int chain)
 44 {
 45     p[x]=++cnt;top[x]=chain;
 46     if(son[x])dfs2(son[x],chain);
 47     for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 48      if(y!=fa[x][0]&&y!=son[x])dfs2(y,y);
 49 }
 50 void pushup(int k)
 51 {
 52     t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx);
 53 }
 54 void update1(int k,int x)
 55 {
 56     t[k].tag=x;t[k].add=0;t[k].mx=x;
 57 }
 58 void update2(int k,int x)
 59 {
 60     t[k].add+=x;t[k].mx+=x;
 61 }
 62 void pushdown(int k)
 63 {
 64     if(t[k].tag!=-1)
 65     {
 66         int x=t[k].tag;
 67         update1(k<<1,x);update1(k<<1|1,x);
 68         t[k].tag=-1;
 69     }
 70     if(t[k].add)
 71     {
 72         int x=t[k].add;
 73         update2(k<<1,x);update2(k<<1|1,x);
 74         t[k].add=0;
 75     }
 76 }
 77 void build(int k,int x,int y)
 78 {
 79     int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1;
 80     t[k].tag=-1;t[k].add=0;
 81     if(l==r){t[k].mx=v[l];return;}
 82     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
 83     pushup(k);
 84 }
 85 void cover(int k,int x,int y,int z)
 86 {
 87     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 88     if(l==x&&r==y){update1(k,z);return;}
 89     pushdown(k);
 90     if(y<=mid)cover(k<<1,x,y,z);
 91     else if(x>mid)cover(k<<1|1,x,y,z);
 92     else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z);
 93     pushup(k);
 94 }
 95 void addd(int k,int x,int y,int z)
 96 {
 97     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 98     if(l==x&&r==y){update2(k,z);return;}
 99     pushdown(k);
100     if(y<=mid)addd(k<<1,x,y,z);
101     else if(x>mid)addd(k<<1|1,x,y,z);
102     else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z);
103     pushup(k);
104 }
105 int query(int k,int x,int y)
106 {
107     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
108     if(l==x&&r==y)return t[k].mx;
109     pushdown(k);
110     if(y<=mid)return query(k<<1,x,y);
111     else if(x>mid)return query(k<<1|1,x,y);
112     else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y));
113 }
114 int lca(int x,int y)
115 {
116     if(dep[x]<dep[y])swap(x,y);
117     int t=dep[x]-dep[y];
118     for(int i=0;i<=16;i++)
119      if(t&(1<<i))x=fa[x][i];
120     if(x==y)return x;
121     for(int i=16;i>=0;i--)
122      if(fa[x][i]!=fa[y][i])
123       {x=fa[x][i];y=fa[y][i];};    
124     return fa[x][0];  
125 }
126 void solveadd(int x,int f,int z)
127 {
128     while(top[x]!=top[f])
129     {
130         addd(1,p[top[x]],p[x],z);
131         x=fa[top[x]][0];
132     }
133     if(f!=x)addd(1,p[f]+1,p[x],z);
134 }
135 void solvecover(int x,int f,int z)
136 {
137     while(top[x]!=top[f])
138     {
139         cover(1,p[top[x]],p[x],z);
140         x=fa[top[x]][0];
141     }
142     if(f!=x)cover(1,p[f]+1,p[x],z);
143 }
144 int solveask(int x,int f)
145 {
146     int ans=0;
147     while(top[x]!=top[f])
148     {
149         ans=max(ans,query(1,p[top[x]],p[x]));
150         x=fa[top[x]][0];
151     }
152     if(f!=x)ans=max(ans,query(1,p[f]+1,p[x]));
153     return ans;
154 }
155 int main()
156 {
157     freopen("input.txt","r",stdin);
158     freopen("output.txt","w",stdout);
159     scanf("%d",&n);
160     for(int i=1;i<n;i++)
161     {
162         scanf("%d%d%d",&a[i],&b[i],&c[i]);
163         insert(a[i],b[i],c[i]);
164     }
165     dep[1]=1;
166     dfs(1);
167     dfs2(1,1);
168     for(int i=1;i<=n;i++)
169     v[1]=0;
170     for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
171     for(int i=1;i<n;i++)v[p[id[i]]]=c[i];
172     build(1,1,n);
173     char s[10];
174     int x,y,z,f;
175     while(1)
176     {
177         scanf("%s",s);
178         switch(s[1])
179         {
180             case 't':return 0;break;
181             case 'd':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
182                      solveadd(x,f,z);solveadd(y,f,z);break;
183             case 'o':scanf("%d%d%d",&x,&y,&z);f=lca(x,y);
184                      solvecover(x,f,z);solvecover(y,f,z);
185                      break;
186             case 'h':scanf("%d%d",&x,&z);cover(1,p[id[x]],p[id[x]],z);break;
187             case 'a':scanf("%d%d",&x,&y);f=lca(x,y);
188                      printf("%d\n",max(solveask(x,f),solveask(y,f)));
189                      break;
190         }
191     }
192 }
View Code

3.不求LCA也过了,哈哈。不过竟然只快了不到1秒钟QAQ

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #define inf 1000000000
 12 #define maxn 100000+1000
 13 #define maxm 500+100
 14 #define eps 1e-10
 15 #define ll long long
 16 using namespace std;
 17 struct edge{int go,next,w;}e[2*maxn];
 18 struct seg{int l,r,tag,add,mx;}t[4*maxn];
 19 int n,tot,cnt=0,top[maxn],a[maxn],b[maxn],c[maxn],p[maxn],v[maxn],id[maxn];
 20 int fa[maxn],dep[maxn],head[maxn],son[maxn],s[maxn];
 21 inline int read()
 22 {
 23     int x=0,f=1;char ch=getchar();
 24     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 25     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 26     return x*f;
 27 }
 28 void ins(int x,int y,int z)
 29 {
 30     e[++tot].go=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
 31 } 
 32 void insert(int x,int y,int z)
 33 {
 34     ins(x,y,z);ins(y,x,z);
 35 }
 36 void dfs(int x)
 37 {
 38     s[x]=1;
 39     for(int y=son[x]=0,i=head[x];i;i=e[i].next)
 40      if(dep[y=e[i].go]==0)
 41      {
 42          dep[y]=dep[x]+1;fa[y]=x;dfs(y);
 43          s[x]+=s[y];if(s[y]>s[son[x]])son[x]=y;
 44      }
 45 }
 46 void dfs2(int x,int chain)
 47 {
 48     p[x]=++cnt;top[x]=chain;
 49     if(son[x])dfs2(son[x],chain);
 50     for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 51      if(y!=fa[x]&&y!=son[x])dfs2(y,y);
 52 }
 53 void pushup(int k)
 54 {
 55     t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx);
 56 }
 57 void update1(int k,int x)
 58 {
 59     t[k].tag=x;t[k].add=0;t[k].mx=x;
 60 }
 61 void update2(int k,int x)
 62 {
 63     t[k].add+=x;t[k].mx+=x;
 64 }
 65 void pushdown(int k)
 66 {
 67     if(t[k].tag!=-1)
 68     {
 69         int x=t[k].tag;
 70         update1(k<<1,x);update1(k<<1|1,x);
 71         t[k].tag=-1;
 72     }
 73     if(t[k].add)
 74     {
 75         int x=t[k].add;
 76         update2(k<<1,x);update2(k<<1|1,x);
 77         t[k].add=0;
 78     }
 79 }
 80 void build(int k,int x,int y)
 81 {
 82     int l=t[k].l=x,r=t[k].r=y,mid=(l+r)>>1;
 83     t[k].tag=-1;t[k].add=0;
 84     if(l==r){t[k].mx=v[l];return;}
 85     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
 86     pushup(k);
 87 }
 88 void cover(int k,int x,int y,int z)
 89 {
 90     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
 91     if(l==x&&r==y){update1(k,z);return;}
 92     pushdown(k);
 93     if(y<=mid)cover(k<<1,x,y,z);
 94     else if(x>mid)cover(k<<1|1,x,y,z);
 95     else cover(k<<1,x,mid,z),cover(k<<1|1,mid+1,y,z);
 96     pushup(k);
 97 }
 98 void addd(int k,int x,int y,int z)
 99 {
100     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
101     if(l==x&&r==y){update2(k,z);return;}
102     pushdown(k);
103     if(y<=mid)addd(k<<1,x,y,z);
104     else if(x>mid)addd(k<<1|1,x,y,z);
105     else addd(k<<1,x,mid,z),addd(k<<1|1,mid+1,y,z);
106     pushup(k);
107 }
108 int query(int k,int x,int y)
109 {
110     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
111     if(l==x&&r==y)return t[k].mx;
112     pushdown(k);
113     if(y<=mid)return query(k<<1,x,y);
114     else if(x>mid)return query(k<<1|1,x,y);
115     else return max(query(k<<1,x,mid),query(k<<1|1,mid+1,y));
116 }
117 void solveadd(int x,int y,int z)
118 {
119     while(top[x]!=top[y])
120     {
121         if(dep[top[x]]<dep[top[y]])swap(x,y);
122         addd(1,p[top[x]],p[x],z);
123         x=fa[top[x]];
124     }
125     if(dep[x]>dep[y])swap(x,y);
126     if(x!=y)addd(1,p[x]+1,p[y],z);
127 }
128 void solvecover(int x,int y,int z)
129 {
130     while(top[x]!=top[y])
131     {
132         if(dep[top[x]]<dep[top[y]])swap(x,y);
133         cover(1,p[top[x]],p[x],z);
134         x=fa[top[x]];
135     }
136     if(dep[x]>dep[y])swap(x,y);
137     if(x!=y)cover(1,p[x]+1,p[y],z);
138 }
139 int solveask(int x,int y)
140 {
141     int ans=0;
142     while(top[x]!=top[y])
143     {
144         if(dep[top[x]]<dep[top[y]])swap(x,y);
145         ans=max(ans,query(1,p[top[x]],p[x]));
146         x=fa[top[x]];
147     }
148     if(dep[x]>dep[y])swap(x,y);
149     if(x!=y)ans=max(ans,query(1,p[x]+1,p[y]));
150     return ans;
151 }
152 int main()
153 {
154     freopen("input.txt","r",stdin);
155     freopen("output.txt","w",stdout);
156     n=read();
157     for(int i=1;i<n;i++)
158     {
159         a[i]=read();b[i]=read();c[i]=read();
160         insert(a[i],b[i],c[i]);
161     }
162     dep[1]=1;
163     dfs(1);
164     dfs2(1,1);
165     for(int i=1;i<=n;i++)
166     v[1]=0;
167     for(int i=1;i<n;i++)id[i]=(dep[a[i]]>dep[b[i]])?a[i]:b[i];
168     for(int i=1;i<n;i++)v[p[id[i]]]=c[i];
169     build(1,1,n);
170     char s[10];
171     int x,y,z,f;
172     while(1)
173     {
174         scanf("%s",s);
175         switch(s[1])
176         {
177             case 't':return 0;break;
178             case 'd':x=read();y=read();z=read();
179                      solveadd(x,y,z);break;
180             case 'o':x=read();y=read();z=read();
181                      solvecover(x,y,z);
182                      break;
183             case 'h':x=read();z=read();cover(1,p[id[x]],p[id[x]],z);break;
184             case 'a':x=read();y=read();
185                      printf("%d\n",solveask(x,y));
186                      break;
187         }
188     }
189 }
View Code

 

 

posted @ 2014-08-22 00:03  ZYF-ZYF  Views(283)  Comments(0Edit  收藏  举报