标签:case efi mon opera element tor air while printf
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 156 Accepted Submission(s): 67
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define mp make_pair #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N = 1e5+5500;; const int M = 160009; const int mod = 1e9+7; const double pi= acos(-1.0); typedef pair<int,int>pii; int n,m,T; int parent[N],up[N],cnt[N]; int dep[N],fa[N][20]; ll w[N]; vector<int>edg[N]; struct man{ int a,b,c,d; ll cost; bool operator < (const man &e)const { return cost<e.cost; } }q[N]; int findFa(int x){ return parent[x]==x?x:parent[x]=findFa(parent[x]); } int findUp(int x){ return up[x]==x?x:up[x]=findUp(up[x]); } void dfs(int u,int f){ fa[u][0]=f; for(int i=1;i<20;i++){ fa[u][i]=fa[fa[u][i-1]][i-1]; } for(int v : edg[u]){ if(v==f)continue; dep[v]=dep[u]+1; dfs(v,u); } } int LCA(int u,int v){ int U=u,V=v; if(dep[u]<dep[v])swap(u,v); for(int i=19;i>=0;i--){ if(dep[fa[u][i]]>=dep[v]){ u=fa[u][i]; } } if(u==v)return (u); for(int i=19;i>=0;i--){ if(fa[u][i]!=fa[v][i]){ u=fa[u][i];v=fa[v][i]; } } return (fa[u][0]); } void Union(int x,int y,ll cost){ x=findFa(x);y=findFa(y); if(x==y)return; parent[x]=y; cnt[y]+=cnt[x]; w[y]+=w[x]+cost; } void merge(int u,int v,ll cost){ while(1){ u=findUp(u); if(dep[u]<=dep[v])return; Union(u,fa[u][0],cost); up[u]=fa[u][0]; } } void solve(man s){ int lca=LCA(s.a,s.b); merge(s.a,lca,s.cost); merge(s.b,lca,s.cost); lca=LCA(s.c,s.d); merge(s.c,lca,s.cost); merge(s.d,lca,s.cost); Union(s.a,s.c,s.cost); } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m);met(fa,0); for(int i=0;i<=n;i++)parent[i]=up[i]=i,cnt[i]=1,w[i]=0,edg[i].clear(); for(int i=1,u,v;i<n;i++){ scanf("%d%d",&u,&v); edg[u].pb(v);edg[v].pb(u); } for(int i=0;i<m;i++){ scanf("%d%d%d%d%lld",&q[i].a,&q[i].b,&q[i].c,&q[i].d,&q[i].cost); } sort(q,q+m); dep[1]=1;dfs(1,0); for(int i=0;i<m;i++)solve(q[i]); printf("%d %lld\n",cnt[findFa(1)],w[findFa(1)]); } }
标签:case efi mon opera element tor air while printf
原文地址:http://www.cnblogs.com/jianrenfang/p/7289635.html