30pts WA on #5 #8 #9 Tarjan+树剖 求调
查看原帖
30pts WA on #5 #8 #9 Tarjan+树剖 求调
779970
lunjiahao楼主2024/11/25 10:52

未知是哪里错了,不确定 这个帖 里的 hack 是否正确,反正是没过那个 hack

#include<bits/stdc++.h>
#define il inline
#define pb push_back
using namespace std;
template <typename T>
il void read(T &x)
{
	x=0;int f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x*=f;
}
const int N=5e5+5;
int n,m,Q,U[N],V[N],a[N],val[N];
int tc,cnt,dfn[N],low[N],bel[N];
bool vis[N];
vector<int> g[N];
stack<int> stk;
void Tarjan(int u,int fa)
{
	dfn[u]=low[u]=++tc;
	vis[u]=1,stk.push(u);
	for(auto v:g[u])
	{
		if(v==fa) continue;
		if(!dfn[v]) Tarjan(v,u),low[u]=min(low[u],low[v]);
			else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		++cnt;
		do
		{
			u=stk.top(),stk.pop(),vis[u]=0;
			bel[u]=cnt,val[cnt]+=a[u];
		}while(dfn[u]^low[u]);
	}
}
int fa[N],dep[N],siz[N],hs[N];
vector<int> G[N];
void dfs1(int u,int fath)
{
	fa[u]=fath,dep[u]=dep[fath]+1;
	siz[u]=1,hs[u]=-1;
	for(auto v:G[u])
	{
		if(v==fath) continue;
		dfs1(v,u),siz[u]+=siz[v];
		if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
	}
}
int top[N];
void dfs2(int u,int t)
{
	top[u]=t;
	if(~hs[u]) dfs2(hs[u],t);
	for(auto v:G[u])
		if(v^fa[u]&&hs[u]^v) dfs2(v,v);
}
int LCA(int u,int v)
{
	while(top[u]^top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	return v;
}
int C[N],ans;
void dfs3(int u)
{
	for(auto v:G[u])
	{
		if(v==fa[u]) continue;
		dfs3(v);
		C[u]+=C[v];
	}
	if(C[u]) ans+=val[u];
}
int main()
{
	read(n),read(m);
	for(int i=1;i<=n;i++) read(a[i]);
	for(int i=1;i<=m;i++)
	{
		read(U[i]),read(V[i]);
		g[U[i]].pb(V[i]),g[V[i]].pb(U[i]);
	}
	Tarjan(1,0);
	for(int i=1;i<=m;i++)
		if(bel[U[i]]^bel[V[i]])
			G[bel[U[i]]].pb(bel[V[i]]),G[bel[V[i]]].pb(bel[U[i]]);
	dfs1(1,0),dfs2(1,1);
	read(Q);
	while(Q--)
	{
		int x,y,lca;
		read(x),read(y),x=bel[x],y=bel[y];
		lca=LCA(x,y);
		C[x]++,C[y]++,C[lca]--,C[fa[lca]]--;
	}
	dfs3(1);
	printf("%d",ans);
	return 0;
}
2024/11/25 10:52
加载中...