yicongli

HDU6393

Mar 12th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1e5+7;
  17.  
  18. struct Edge{
  19.     int u,v,w;
  20. }E[N];
  21.  
  22. int ecnt;
  23. int fir[N];
  24. int nex[N<<1];
  25. int to[N<<1];
  26. int w[N<<1];
  27.  
  28. inline void addedge(int u,int v,int c){
  29.     nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  30.     nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
  31. }
  32.  
  33. int fa[N];
  34. int siz[N];
  35. int dep[N];
  36. int son[N];
  37. ll dis[N];
  38. int U,V,W;
  39.  
  40. void dfs1(int x,int f){
  41.     fa[x]=f;
  42.     siz[x]=1;
  43.     dep[x]=dep[f]+1;
  44.     for(int i=fir[x];i;i=nex[i]){
  45.         int v=to[i];
  46.         if(v==f)continue;
  47.         if(siz[v]){
  48.             U=x,V=v,W=w[i];
  49.             continue;
  50.         }
  51.         dis[v]=dis[x]+w[i];
  52.         dfs1(v,x);
  53.         siz[x]+=siz[v];
  54.         if(siz[son[x]]<siz[v])son[x]=v;
  55.     }
  56. }
  57.  
  58. int dfs_clock;
  59. int top[N];
  60. int dfn[N];
  61. int ptn[N];
  62.  
  63. void dfs2(int x,int t){
  64.     top[x]=t;
  65.     dfn[x]=++dfs_clock;
  66.     ptn[dfs_clock]=x;
  67.     if(!son[x])return ;
  68.     dfs2(son[x],t);
  69.     for(int i=fir[x];i;i=nex[i]){
  70.         int v=to[i];
  71.         if(v==son[x]||v==fa[x])continue;
  72.         if(x==U&&v==V)continue;
  73.         dfs2(v,v);
  74.     }
  75. }
  76.  
  77. #define ls (rt<<1)
  78. #define rs (rt<<1|1)
  79. ll val[N<<2];
  80. ll tag[N<<2];
  81.  
  82. void build(int rt,int l,int r){
  83.     tag[rt]=0;
  84.     if(l==r){
  85.         int x=ptn[l];
  86.         val[rt]=dis[x];
  87.         return ;
  88.     }
  89.     int mid=(l+r)>>1;
  90.     build(ls,l,mid);
  91.     build(rs,mid+1,r);
  92. }
  93.  
  94. inline void pushdown(int rt){
  95.     if(tag[rt]){
  96.         val[ls]+=tag[rt];
  97.         val[rs]+=tag[rt];
  98.         tag[ls]+=tag[rt];
  99.         tag[rs]+=tag[rt];
  100.         tag[rt]=0;
  101.     }
  102. }
  103.  
  104. void modify(int rt,int l,int r,int x,int y,int v){
  105.     if(x<=l&&r<=y){
  106.         if(l==r)val[rt]+=v;
  107.         else tag[rt]+=v;
  108.         return ;
  109.     }
  110.     pushdown(rt);
  111.     int mid=(l+r)>>1;
  112.     if(x<=mid)modify(ls,l,mid,x,y,v);
  113.     if(y>mid)modify(rs,mid+1,r,x,y,v);
  114. }
  115.  
  116. ll query(int rt,int l,int r,int x){
  117.     if(l==r)return val[rt];
  118.     pushdown(rt);
  119.     int mid=(l+r)>>1;
  120.     if(x<=mid)return query(ls,l,mid,x);
  121.     else return query(rs,mid+1,r,x);
  122. }
  123.  
  124. inline int lca(int u,int v){
  125.     while(top[u]!=top[v]){
  126.         if(dep[top[u]]<dep[top[v]])swap(u,v);
  127.         u=fa[top[u]];
  128.     }
  129.     return dep[u]<dep[v]?u:v;
  130. }
  131.  
  132. int n,q;
  133.  
  134. inline ll dist(int u,int v){
  135.     ll ret=0;
  136.     ret+=query(1,1,n,dfn[u]);
  137.     ret+=query(1,1,n,dfn[v]);
  138.     ret-=2*query(1,1,n,dfn[lca(u,v)]);
  139.     return ret;
  140. }
  141.  
  142. inline void Modify(int x,int y){
  143.     int u=E[x].u;
  144.     int v=E[x].v;
  145.     if(u==U&&v==V)W=y;
  146.     else {
  147.         int t=dep[u]<dep[v]?v:u;
  148.         modify(1,1,n,dfn[t],dfn[t]+siz[t]-1,y-E[x].w);
  149.         E[x].w=y;
  150.     }
  151. }
  152.  
  153. inline void Query(int x,int y){
  154.     ll ans=dist(x,y);
  155.     ans=min(ans,dist(x,U)+W+dist(V,y));
  156.     ans=min(ans,dist(x,V)+W+dist(U,y));
  157.     printf("%lld\n",ans);
  158. }
  159.  
  160. int main(){
  161. //  freopen(".in","r",stdin);
  162. //  freopen(".out","w",stdout);
  163.     int T;r(T);
  164.     while(T--){
  165.         r(n),r(q);
  166.         ecnt=dfs_clock=0;
  167.         memset(fir+1,0,n<<2);
  168.         memset(siz+1,0,n<<2);
  169.         memset(son+1,0,n<<2);
  170.         for(int i=1;i<=n;++i){
  171.             int u,v,c;
  172.             r(u),r(v),r(c);
  173.             E[i]=Edge{u,v,c};
  174.             addedge(u,v,c);
  175.         }
  176.         dfs1(1,0);
  177.         dfs2(1,0);
  178.         build(1,1,n);
  179.         while(q--){
  180.             int opt,x,y;
  181.             r(opt),r(x),r(y);
  182.             if(opt)Query(x,y);
  183.             else Modify(x,y);
  184.         }
  185.     }
  186.     return 0;
  187. }
  188. /*
  189. 2
  190. 5 5
  191. 1 2 3
  192. 2 3 5
  193. 2 4 5
  194. 2 5 1
  195. 4 3 3
  196. 0 1 5
  197. 1 3 2
  198. 1 5 4
  199. 0 5 4
  200. 1 5 1
  201. 5 3
  202. 1 2 3
  203. 1 3 2
  204. 3 4 4
  205. 4 5 5
  206. 2 5 5
  207. 0 1 3
  208. 0 4 1
  209. 1 1 4
  210.  
  211. */
Advertisement
Add Comment
Please, Sign In to add comment