QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#547419 | #2214. Link Cut Digraph | Iceturky | WA | 47ms | 47228kb | C++17 | 3.4kb | 2024-09-04 21:38:03 | 2024-09-04 21:38:03 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<unordered_map>
#include<queue>
#define int long long
#define ll long long
#define ls (x<<1)
#define rs ((x<<1)|1)
#define mid ((l+r)>>1)
#define pc(x) putchar(x)
#define inf ((ll)(1e18+7))
#define lowbit(x) (x&(-x))
#define pb push_back
#define pir pair<int,int>
#define fi first
#define se second
#define all(x) x.begin(),x.end()
using namespace std;
inline ll read()
{
ll w,f=1;char c;
while((c=getchar())>'9'||c<'0')
if(c=='-')f=-1;
w=c-'0';
while((c=getchar())>='0'&&c<='9')
w=w*10+c-'0';
return w*f;
}
int printt[50],never_use;
inline void print(ll x)
{
if(x==0)
pc(48);
if(x<0)
pc('-'),x=-x;
while(x)
printt[++never_use]=x%10,x/=10;
while(never_use)
pc(printt[never_use--]+48);
}
const int N=5e5+5,M=5e5+5;
pir EE[M];
struct Edge{
int u,v,id;
}E[M];
vector<pir> tim[M];
struct edge{
int v,nxt;
}e[M];
int head[N],tott;
void add(int u,int v){e[++tott]={v,head[u]},head[u]=tott;}
int dfn[N],low[N],dfncnt;
int stk[N],tot;
int col[N],cnt;
void tarjan(int u){
// cout<<" "<<u<<" "<<dfn[u]<<endl;
low[u]=dfn[u]=++dfncnt;
stk[++tot]=u;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!col[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
cnt++;
int x;
do{
x=stk[tot];
col[x]=cnt;
stk[tot]=0;
tot--;
}while(x!=u);
}
}
void calc(int l,int r,int L,int R){
if(l==r){
for(int i=L;i<=R;i++)
tim[l].pb(EE[E[i].id]);
return;
}
for(int i=L;i<=R;i++)
if(E[i].id<=mid)
add(E[i].u,E[i].v);
// cout<<l<<" "<<r<<" "<<L<<" "<<R<<endl;
// for(int i=L;i<=R;i++){
// print(E[i].u),pc(' '),print(E[i].v),pc(' '),print(E[i].id),pc('\n');
// cout<<head[E[i].u]<<" "<<head[E[i].v]<<"\n";
// }
for(int i=L;i<=R;i++){
if(!dfn[E[i].u])
tarjan(E[i].u);
}
tott=0;
dfncnt=0;
cnt=0;
tot=0;
for(int i=L;i<=R;i++){
head[E[i].u]=head[E[i].v]=0;
dfn[E[i].u]=dfn[E[i].v]=0;
low[E[i].u]=low[E[i].v]=0;
col[E[i].u]=col[E[i].v]=0;
}
vector<Edge> E1,E2;
int RR=R;
for(int i=L;i<=R;i++){
// if(l==9&&r==10){
// cout<<E[i].u<<" "<<E[i].v<<" "<<E[i].id<<endl;
// cout<<col[E[i].u]<<" "<<col[E[i].v]<<endl;
// }
if(col[E[i].u]!=col[E[i].v])
E2.pb({col[E[i].u],col[E[i].v],E[i].id});
else if(E[i].id<=mid)
E1.pb(E[i]);
else
RR--;
}
int len=E1.size();
for(int i=0;i<E1.size();i++)
E[i+L]=E1[i];
for(int i=0;i<E2.size();i++)
E[i+len+L]=E2[i];
calc(l,mid,L,L+len-1);
calc(mid+1,r,L+len,RR);
}
struct DSU{
int fa[N],sum[N];
void init(int n){
for(int i=1;i<=n;i++)
fa[i]=i,sum[i]=1;
}
int fd(int x){
return fa[x]==x?x:fa[x]=fd(fa[x]);
}
}D;
signed main(){
int n=read(),m=read();
for(int i=1;i<=m;i++)
E[i]={read(),read(),i},EE[i]={E[i].u,E[i].v};
calc(1,m+1,1,m);
D.init(n);
int ans=0;
for(int i=1;i<=m;i++){
for(pir j:tim[i]){
int u=j.fi,v=j.se;
//cout<<u<<" "<<v<<endl;
u=D.fd(u),v=D.fd(v);
if(u==v)
continue;
ans-=D.sum[u]*(D.sum[u]-1)/2;
ans-=D.sum[v]*(D.sum[v]-1)/2;
if(D.sum[u]<D.sum[v])
swap(u,v);
D.fa[v]=u;
D.sum[u]+=D.sum[v];
ans+=D.sum[u]*(D.sum[u]-1)/2;
}print(ans),pc('\n');
}
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 47ms
memory: 47228kb