• noi2018 情报中心


    。。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 #define ppp pair<int,pair<int,ll> >
     5 #define X first
     6 #define Y second
     7 const int N=1e5+5; 
     8 const ll inf=1e17;
     9 int n,m,cc,T,tt,nn,tp,dep[N],vis[N],lg[N<<1],f[N<<1][20],dfn[N],t[N],st[N],hd[N],rt[N],ls[N*40],rs[N*40];
    10 ll ans,d[N],mx1[N*40],mx2[N*40];
    11 vector<int>g[N];vector<ppp>v[N];
    12 struct E{int v,nxt;ll w;}e[N<<1];
    13 inline void add(int u,int v,ll w){e[++cc]=(E){v,hd[u],w};hd[u]=cc;}
    14 void dfs(int x){f[++T][0]=x;dfn[x]=T;for(int i=hd[x];i;i=e[i].nxt){int y=e[i].v;dep[y]=dep[x]+1;d[y]=d[x]+e[i].w;dfs(y);f[++T][0]=x;}}
    15 inline int mn(int u,int v){return dep[u]<dep[v]?u:v;}
    16 inline int lca(int u,int v){u=dfn[u];v=dfn[v];if(u>v)swap(u,v);int d=lg[v-u+1];return mn(f[u][d],f[v-(1<<d)+1][d]);}
    17 inline ll dis(int u,int v){return d[u]+d[v]-d[lca(u,v)]*2;}
    18 inline int nwnd(){int x=++tt;ls[x]=rs[x]=0;mx1[x]=mx2[x]=-inf;return x;}
    19 inline void up(int x){mx1[x]=max(mx1[ls[x]],mx1[rs[x]]);mx2[x]=max(mx2[ls[x]],mx2[rs[x]]);}
    20 void upd(int&x,int l,int r,int p,ll v1,ll v2,ll d)
    21 {
    22     if(!x)x=nwnd();mx1[x]=max(mx1[x],v1);mx2[x]=max(mx2[x],v2);if(l==r)return;
    23     int mid=l+r>>1;if(p<=mid){ans=max(ans,v1+mx2[rs[x]]-d);upd(ls[x],l,mid,p,v1,v2,d);}
    24     else {ans=max(ans,v2+mx1[ls[x]]-d);upd(rs[x],mid+1,r,p,v1,v2,d);} 
    25 }
    26 int merge(int x,int y,int l,int r,ll d)
    27 {
    28     if(!x||!y)return x+y;int mid=l+r>>1;
    29     if(l==r){mx1[x]=max(mx1[x],mx1[y]);mx2[x]=max(mx2[x],mx2[y]);return x;}
    30     ans=max(ans,mx1[ls[x]]+mx2[rs[y]]-d);ans=max(ans,mx1[ls[y]]+mx2[rs[x]]-d);
    31     ls[x]=merge(ls[x],ls[y],l,mid,d);rs[x]=merge(rs[x],rs[y],mid+1,r,d);up(x);return x;
    32 } 
    33 void cut(int&x,int l,int r,int p)
    34 {
    35     if(!x)return;if(l==r){x=0;return;}int mid=l+r>>1;
    36     if(p<=mid)rs[x]=0,cut(ls[x],l,mid,p);else cut(rs[x],mid+1,r,p);up(x);
    37 }
    38 void dfs1(int x){for(int i=hd[x],y;i;i=e[i].nxt)dfs1(y=e[i].v),rt[x]=merge(rt[x],rt[y],1,n,d[x]);cut(rt[x],1,n,dep[x]-1);}
    39 struct dia
    40 {
    41     int u[2];ll v[2],l;dia(){u[0]=u[1]=0;v[0]=v[1]=l=-inf;}
    42     dia(int x,ll w){u[0]=x;v[0]=w;u[1]=0;v[1]=-inf;l=-inf;}
    43 }tr[N];
    44 inline bool cmp(ppp x,ppp y){return dfn[x.X]<dfn[y.X];}
    45 inline dia merge(dia x,dia y,ll d)
    46 {
    47     dia r;ll w;r=x.l>y.l?x:y;
    48     for(int i=0;i<2;i++)if(x.u[i])for(int j=0;j<2;j++)if(y.u[j])
    49     {
    50         w=dis(x.u[i],y.u[j])+x.v[i]+y.v[j];ans=max(ans,(w-d)/2);
    51         if(w>r.l){r.u[0]=x.u[i];r.u[1]=y.u[j];r.v[0]=x.v[i];r.v[1]=y.v[j];r.l=w;}
    52     }
    53     return r;
    54 }
    55 void dfss(int x,int rt){for(int i=0;i<g[x].size();i++){int y=g[x][i];dfss(y,rt);if(x!=rt)tr[x]=merge(tr[x],tr[y],d[x]*2);}vis[x]=0;g[x].clear();}
    56 inline void ins(int x)
    57 {
    58     int y=lca(x,st[tp]);if(!vis[y]){vis[y]=1;t[++nn]=y;}
    59     while(tp>1&&dep[st[tp-1]]>=dep[y])g[st[tp-1]].push_back(st[tp]),tp--;
    60     if(st[tp]!=y)g[y].push_back(st[tp]),st[tp]=y;st[++tp]=x;
    61 } 
    62 void sol()
    63 {
    64     scanf("%d",&n);ans=-inf;cc=T=tt=0;dep[1]=1;
    65     for(int i=1;i<=n;i++)hd[i]=0,rt[i]=0,v[i].clear();
    66     for(int i=1;i<n;i++){int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);add(u,v,w);}
    67     dfs(1);scanf("%d",&m);for(int i=2;i<=T;i++)lg[i]=lg[i>>1]+1;
    68     for(int j=1;j<=18;j++)for(int i=1;i+(1<<j)-1<=T;i++)f[i][j]=mn(f[i][j-1],f[i+(1<<j-1)][j-1]);
    69     for(int i=1;i<=m;i++)
    70     {
    71         int x,y,t;ll z;scanf("%d%d%lld",&x,&y,&z);t=lca(x,y);ll w=dis(x,y)-z;
    72         if(x!=t)upd(rt[x],1,n,dep[t],w,w+d[t],d[x]),v[t].push_back(make_pair(x,make_pair(y,w+d[x]-z)));
    73         if(y!=t)upd(rt[y],1,n,dep[t],w,w+d[t],d[y]),v[t].push_back(make_pair(y,make_pair(x,w+d[y]-z)));
    74     }
    75     dfs1(1);
    76     for(int i=1;i<=n;i++)
    77     {
    78         sort(v[i].begin(),v[i].end(),cmp);tp=nn=0;st[++tp]=i;vis[i]=1;t[++nn]=i;
    79         for(int j=0;j<v[i].size();j++)if(!vis[v[i][j].X]){vis[v[i][j].X]=1;t[++nn]=v[i][j].X;ins(v[i][j].X);}
    80         while(tp>1){g[st[tp-1]].push_back(st[tp]);tp--;}
    81         for(int j=1;j<=nn;j++){int x=t[j];tr[x].u[0]=tr[x].u[1]=0;tr[x].v[0]=tr[x].v[1]=tr[x].l=-inf;}
    82         for(int j=0;j<v[i].size();j++){dia x=dia(v[i][j].Y.X,v[i][j].Y.Y);tr[v[i][j].X]=merge(tr[v[i][j].X],x,d[v[i][j].X]*2);}
    83         dfss(i,i);
    84     }
    85     if(ans<=-1e16)puts("F");else printf("%lld
    ",ans);
    86 }
    87 int main()
    88 {
    89     freopen("center.in","r",stdin);freopen("center.out","w",stdout);
    90     mx1[0]=mx2[0]=-inf;int T;scanf("%d",&T);while(T--)sol();return 0;
    91 } 
  • 相关阅读:
    第5章 继承
    第4章 对象和类
    第3章 java的基本程序设计结构
    Java读写properties格式配置文件
    Net学习日记_三层_2
    Net学习日记_三层_1_登录页面总结篇_残缺版
    Net学习日记_三层_1
    Net学习日记_SQL进阶_2
    Net学习日记_SQL进阶_1
    Net学习日记_ADO.Net_3_案例
  • 原文地址:https://www.cnblogs.com/alonefight/p/10917242.html
Copyright © 2020-2023  润新知