QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#547425#2214. Link Cut DigraphIceturkyWA 41ms32192kbC++173.4kb2024-09-04 21:40:552024-09-04 21:40:56

Judging History

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

  • [2024-09-04 21:40:56]
  • 评测
  • 测评结果:WA
  • 用时:41ms
  • 内存:32192kb
  • [2024-09-04 21:40:55]
  • 提交

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=1e5+5,M=2.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;
bool vis[N];
int stk[N],tot;
int col[N],cnt;
void tarjan(int u){
//	cout<<" "<<u<<" "<<dfn[u]<<endl;
	low[u]=dfn[u]=++dfncnt;
	vis[u]=1;
	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++;
//		cout<<u<<" "<<cnt<<endl;
		while(1){
			vis[stk[tot]]=0;
			col[stk[tot]]=cnt;
			tot--;
			if(stk[tot+1]==u)
				break;
		}
	}
}

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;
		vis[E[i].u]=vis[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;
			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;
}

Details

Test #1:

score: 0
Wrong Answer
time: 41ms
memory: 32192kb