站外题求助
  • 板块题目总版
  • 楼主Autofreeze
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/4/8 22:38
  • 上次更新2023/11/5 00:51:03
查看原帖
站外题求助
341373
Autofreeze楼主2021/4/8 22:38

RT,https://darkbzoj.tk/problem/3331

代码

#include<bits/stdc++.h>
#define re register
#define N 201001
#define MAX 2001
#define inf 1e18
#define eps 1e-10
using namespace std;
typedef long long ll;
typedef double db;
inline void read(re ll &ret)
{
    ret=0;re bool pd=false;re char c=getchar();
    while(!isdigit(c)){pd|=c=='-';c=getchar();}
    while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
    ret=pd?-ret:ret;
    return;
}
ll n,m,q,x,y,dfn[N],low[N],cnt,tot,sum[N],son[N],siz[N],top[N],f[N],dep[N],val[N];
vector<ll>v[N],g[N];
stack<ll>s;
bool cut[N];
inline void tarjan(re ll ver)
{
	dfn[ver]=low[ver]=++cnt;
	s.push(ver);
	for(re unsigned i=0;i<v[ver].size();i++)
	{
		re ll to=v[ver][i];
		if(!dfn[to])
		{
			tarjan(to);
			low[ver]=min(low[ver],low[to]);
			if(low[to]>=dfn[ver])
			{
				cut[ver]=true;
				tot++;
				while(s.top()!=ver)
				{
					g[tot].push_back(s.top());
					g[s.top()].push_back(tot);
					s.pop();
				}
				g[tot].push_back(s.top());
				g[s.top()].push_back(tot);
			}
		}
		else
			low[ver]=min(low[ver],dfn[to]);
	}
	return;
}
inline void dfs1(re ll ver,re ll fa)
{
	siz[ver]=1;
	dep[ver]=dep[fa]+1;
	for(re unsigned i=0;i<g[ver].size();i++)
	{
		re ll to=g[ver][i];
		if(to==fa)
			continue;
		dfs1(to,ver);
		siz[ver]+=siz[to];
		if(siz[to]>siz[son[ver]])
			son[ver]=to;
	}
	return;
}
inline void dfs2(re ll ver,re ll fa,re ll tp)
{
	top[ver]=tp;
	f[ver]=fa;
	if(son[ver])
		dfs2(son[ver],ver,tp);
	for(re unsigned i=0;i<g[ver].size();i++)
	{
		re ll to=g[ver][i];
		if(to==fa||to==son[ver])
			continue;
		dfs2(to,ver,to);
	}
	return;
}
inline ll lca(re ll p,re ll q)
{
	while(top[p]^top[q])
	{
		if(dep[top[p]]<dep[top[q]])
			swap(p,q);
		p=f[top[p]];
	}
	if(dep[p]>dep[q])
		swap(p,q);
	return p;
}
inline void dfs3(re ll ver,re ll fa)
{
	for(re unsigned i=0;i<g[ver].size();i++)
	{
		re ll to=g[ver][i];
		if(to==fa)
			continue;
		dfs3(to,ver);
		val[ver]+=val[to];
	}
	return;
}
signed main()
{
	read(n);
	read(m);
	read(q);
	for(re int i=1;i<=m;i++)
	{
		read(x);
		read(y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	tot=n;
	tarjan(1);
	dfs1(1,0);
	dfs2(1,0,1);
	for(re int i=1;i<=q;i++)
	{
		read(x);
		read(y);
		re ll tmp=lca(x,y);
		val[f[tmp]]--;
		val[tmp]--;
		val[x]++;
		val[y]++;
	}
	dfs3(1,0);
	for(re int i=1;i<=n;i++)
		printf("%lld\n",val[i]);
    exit(0);
}
2021/4/8 22:38
加载中...