QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#20695#2214. Link Cut DigraphCoder_ZWA 455ms72332kbC++141.7kb2022-02-17 17:04:452022-05-03 11:12:01

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-03 11:12:01]
  • 评测
  • 测评结果:WA
  • 用时:455ms
  • 内存:72332kb
  • [2022-02-17 17:04:45]
  • 提交

answer

#include<bits/stdc++.h>
#define p_b push_back
using namespace std;
typedef long long ll;
typedef vector<int> vint;
const int N=3e5;
vint a[N+5];
int n,m,fa[N+5],x[N+5],y[N+5],low[N+5],dfn[N+5],tim,sta[N+5],tp,vis[N+5],bel[N+5],tot,col[N+5],siz[N+5];
ll ans[N+5];
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
void upd(int &x,int y) {if(x>y) x=y;}
void tarjan(int u)
{
	dfn[u]=low[u]=++tim;
	sta[++tp]=u;vis[u]=1;
	for(int v: a[u])
		if(!dfn[v]) tarjan(v),upd(low[u],low[v]);
		else if(vis[v]) upd(low[u],dfn[v]);
	if(low[u]==dfn[u])
	{
		int tmp=sta[tp--],xx=tmp;
		vis[tmp]=0;bel[tmp]=xx;
		while(tmp!=u) tmp=sta[tp--],vis[tmp]=0,bel[u]=xx;
	}
}
void work(int l,int r,vint e)
{
	int mid=(l+r)>>1;++tot;
	vint np;
	for(int i=0,sz=e.size(); i<sz; i++) if(e[i]<=mid)
	{
		int tx=getf(x[e[i]]),ty=getf(y[e[i]]);
		if(col[tx]!=tot) col[tx]=tot,a[tx].clear(),dfn[tx]=low[tx]=0,np.p_b(tx);
		if(col[ty]!=tot) col[ty]=tot,a[ty].clear(),dfn[ty]=low[ty]=0,np.p_b(ty);
		a[tx].p_b(ty);
	}
	for(int u: np) if(!dfn[u]) tarjan(u);
	if(l==r)
	{
		ll delta=0;
		for(int u: np) if(getf(u)!=getf(bel[u]))
		{
			delta+=1ll*siz[getf(bel[u])]*siz[getf(u)];
			siz[getf(bel[u])]+=siz[getf(u)];
			fa[getf(u)]=getf(bel[u]);
		}
		ans[l]=ans[l-1]+delta;
	}
	else
	{
		vint el,er;
		for(int i=0,sz=e.size(); i<sz; i++)
		{
			int tx=getf(x[e[i]]),ty=getf(y[e[i]]);
			if(col[tx]==tot&&col[ty]==tot&&bel[tx]==bel[ty]) el.p_b(e[i]);
			else er.p_b(e[i]);
		}
		work(l,mid,el);work(mid+1,r,er);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) siz[i]=1,fa[i]=i;
	vint tmp;
	for(int i=1; i<=m; i++) scanf("%d%d",&x[i],&y[i]),tmp.p_b(i);
	work(1,m,tmp);for(int i=1; i<=m; i++) printf("%lld\n",ans[i]); 
	return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 455ms
memory: 72332kb