求助,第七个点MLE!

P2495 [SDOI2011] 消耗战

希望更丰富的展现?使用Markdown
by wxy_god @ 2019-02-28 22:14:45


希望更丰富的展现?使用Markdown
by Le_temps_des_fleurs @ 2019-02-28 22:17:08


不希望更丰富的展现?不使用Markdown
by wxwoo @ 2019-02-28 22:23:37


```cpp #include<stdio.h> #include<algorithm> #include<vector> #include<queue> #include<stack> using namespace std; struct EDGE { long long to,v; EDGE(long long too,long long vv) { to=too,v=vv; } }; struct Node { long long min,x; Node(long long xx,long long minn) { min=minn,x=xx; } }; const long long inf=1e9; long long top,in[5000005],cnt,n,deep[5000005],minn[1000005][22],m; int dfn[5000005], s[5000005],v[5000005],f[1000005][22]; vector<EDGE> g[5000005],g2[5000005]; long long cmp(long long x,long long y) { return dfn[x]<dfn[y]; } void dfs(long long x) { cnt++,dfn[x]=cnt; for(long long i=0; i<g[x].size(); i++) if(g[x][i].to!=f[x][0]) { f[g[x][i].to][0]=x; minn[g[x][i].to][0]=g[x][i].v; deep[g[x][i].to]=deep[x]+1; dfs(g[x][i].to); } } Node lca(long long x,long long y) { Node sb=Node(0,inf); if(deep[x]<deep[y]) swap(x,y); for(long long i=20; i>=0; i--) if(deep[f[x][i]]>=deep[y]) sb.min=min(sb.min,minn[x][i]),x=f[x][i]; if(x==y) { sb.x=x; return sb; } for(long long i=20; i>=0; i--) if(f[x][i]!=f[y][i]) sb.min=min(sb.min,min(minn[x][i],minn[y][i])),x=f[x][i],y=f[y][i]; sb.min=min(sb.min,min(minn[x][0],minn[y][0])); sb.x=f[x][0]; return sb; } void add(long long x,long long y,long long v) { if(x==y||!x||!y) return; g2[x].push_back(EDGE(y,v)); g2[y].push_back(EDGE(x,v)); } long long dfs2(long long x,long long fa) { long long sum=0; for(long long i=0; i<g2[x].size(); i++) if(g2[x][i].to!=fa) { if(v[g2[x][i].to]) sum+=g2[x][i].v,dfs2(g2[x][i].to,x); else sum+=min(g2[x][i].v,dfs2(g2[x][i].to,x)); } g2[x].clear(); return sum==0?inf:sum; } int main() { scanf("%lld",&n); for(long long i=1; i<n; i++) { long long x,y,z; scanf("%lld%lld%lld",&x,&y,&z); g[x].push_back(EDGE(y,z)); g[y].push_back(EDGE(x,z)); } deep[1]=1; dfs(1ll); for(long long i=0; i<=20; i++) minn[0][i]=inf,minn[0][i]=inf;; for(long long i=1; i<=n; i++) for(long long j=1; j<=20; j++) f[i][j]=f[f[i][j-1]][j-1],minn[i][j]=min(minn[i][j-1],minn[f[i][j-1]][j-1]); scanf("%lld",&m); while(m--) { long long k; scanf("%lld",&k); for(long long i=1; i<=k; i++) scanf("%lld",&in[i]),v[in[i]]=1; sort(in+1,in+1+k,cmp); top=1,s[1]=1; for(long long i=1; i<=k; i++) { long long now=in[i],ff=lca(now,s[top]).x; while(1) { if(deep[ff]>=deep[s[top-1]]) { add(ff,s[top],lca(ff,s[top]).min); top--; if(s[top]!=ff) top++,s[top]=ff; break; } add(s[top-1],s[top],lca(s[top-1],s[top]).min); top--; } if(s[top]!=now) top++,s[top]=now; } while(--top) add(s[top],s[top+1],lca(s[top],s[top+1]).min); printf("%lld\n",dfs2(1ll,1ll)); for(long long i=1; i<=k; i++) v[in[i]]=0; } return 0; } ```
by ieeqwq @ 2019-02-28 22:24:55


希望更丰富的展现?使用Markdown
by 刘心远 @ 2019-02-28 22:26:17


|