QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#20695 | #2214. Link Cut Digraph | Coder_Z | WA | 455ms | 72332kb | C++14 | 1.7kb | 2022-02-17 17:04:45 | 2022-05-03 11:12:01 |
Judging History
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