kib吧 关注:12贴子:118
  • 1回复贴,共1

poj 2763

收藏回复

  • 114.247.10.*
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <utility>
#include <cmath>
#define INF 1000000000
using namespace std;
typedef pair< long , long > Enode;
long N,Q,S;
vector< Enode > ta[300005];
long vis[300005],Vn;
long Line1[300005];
long Line2[300005];
long RA[300005][20];
long size[300005];
long height[300005];
long where[300005];
long logt[300005];
long A[300005],B[300005];
long Tsum[300005];
void add(long x,long y)
{
     while(x<=N)
     {
         Tsum[x]+=y;
         x+=(x&-x);
     }
}
long sum(long x)
{
     long res=0;
     while(x>0)
     {
         res+=Tsum[x];
         x-=(x&-x);
     }
     return res;
}
void dfs(long x,long len,long ht)
{
     vector< Enode >::iterator it;
     vis[x]=Vn;
     Line1[x]=++Line1[0];
     Line2[++Line2[0]]=x;
     where[x]=Line2[0];
     height[x]=ht;
     add(Line1[x],len);
     add(Line1[x]+1,-len);
     for(it=ta[x].begin();it!=ta[x].end();it++)   
         if(vis[it->first]!=Vn)
             {
                 dfs(it->first,len+it->second,ht+1);
                 Line2[++Line2[0]]=x;
                 size[x]+=size[it->first];
             }
     size[x]++;
}
void buildRA()
{
     long i,j;
     logt[1]=0;
     for(i=2;i<=Line2[0];i++)
         if((i&(i-1))==0) logt[i]=logt[i-1]+1;
         else logt[i]=logt[i-1];
     for(i=1;i<=Line2[0];i++)
         RA[i][0]=Line2[i];
     for(i=Line2[0];i>=1;i--)
         for(j=1;i+(1<<j)-1<=Line2[0];j++)
             if(height[RA[i][j-1]]<height[RA[i+(1<<(j-1))][j-1]]) RA[i][j]=RA[i][j-1];



1楼2010-02-16 01:01回复
    • 114.247.10.*
                 else RA[i][j]=RA[i+(1<<(j-1))][j-1];
    }
    long RMQ(long L,long R)
    {
         long k=logt[R-L+1];
         if(height[RA[L][k]]<height[RA[R-(1<<k)+1][k]]) return RA[L][k];
         else return RA[R-(1<<k)+1][k];
    }
    long LCA(long x,long y)
    {
         if(where[x]>where[y]) swap(x,y);
         return RMQ(where[x],where[y]);
    }
    void init()
    {
         long i;
         long x,y,v,u;
         long L;
        
         cin >> N >> Q >> S;
         for(i=1;i<N;i++)
         {
             scanf("%ld %ld %ld",&x,&y,&v);
             A[i]=x;B[i]=y;
             ta[x].push_back( make_pair(y,v) );
             ta[y].push_back( make_pair(x,v) );
         }
         ++Vn;dfs(1,0,0);
         buildRA();
         while(Q--)
         {
             scanf("%ld",&v);
             if(v==0)
             {
                 scanf("%ld",&y);
                 x=LCA(S,y);
                 printf("%ld\n",sum(Line1[S])+sum(Line1[y])-2*sum(Line1[x]));
                 S=y;
             }
             else {
                         scanf("%ld %ld",&u,&v);
                         x=A[u];y=B[u];
                         if(Line1[x]>Line1[y]) swap(x,y);
                         L=sum(Line1[y])-sum(Line1[x]);
                         add(Line1[y],v-L);
                         add(Line1[y]+size[y],L-v);
                      }
         }
    }
    int main()
    {
         init();
         return 0;
    }
    


    2楼2010-02-16 01:01
    回复