zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",solveask(x,y));
    186                      break;
    187         }
    188     }
    189 }
    View Code
  • 相关阅读:
    笔记
    BlangenOA项目展示(附源码)
    笔记截至20190406
    ASP.NET MVC 使用过滤器需要注意
    单例模式和HttpContext线程内唯一
    C#线程/进程同步(lock、Mutex、Semaphore)
    Web标准
    JavaScript 放置在文档最后面可以使页面加载速度更快
    GUI 面板实现 (解决了关闭事件)
    GUI 实现多个窗口 (使用封装特性)
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3928368.html
Copyright © 2011-2022 走看看