WA+TLE+MLE 25pts 悬一关代码求调
查看原帖
WA+TLE+MLE 25pts 悬一关代码求调
906856
A2_Zenith楼主2024/4/4 17:04

逆天记录

#include<bits/stdc++.h>
#define int long long
#define doub long double
using namespace std;
const int maxn=5e5+7;
const int mod=1e9+7;
int n,m;
//----------------------------------------
vector<int> E[maxn];
int low[maxn];
int dfn[maxn];
int dfscount;
set<int> del[maxn];
vector<int> DCC[maxn];
int DCCcount;
int bel[maxn];
int vis[maxn];
void tarjan(int u,int fa){
	low[u]=dfn[u]=++dfscount;
	bool f=false;
	for(int i=0;i<E[u].size();i++){
		int v=E[u][i];
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>dfn[u]){
				del[u].insert(v);
				del[v].insert(u);
			}
		}
		else if(v!=fa||f){
			low[u]=min(low[u],dfn[v]);
		}
		else f=1;
	}
}
void DFS(int u){
	vis[u]=true;
	bel[u]=DCCcount;
	DCC[DCCcount].push_back(u);
	for(int i=0;i<E[u].size();i++){
		int v=E[u][i];
		if(del[u].count(v)||vis[v])continue;
		DFS(v);
	}
}
//----------------------------------------
inline int qpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
//----------------------------------------
int ans;
int N;
vector<int> T[maxn];
int Ed[maxn];
int Ve[maxn];
int s[maxn];
void dfs(int u,int fa){
	s[u]=Ed[u];
	for(int i=0;i<T[u].size();i++){
		int v=E[u][i];
		if(v==fa)continue;
		dfs(v,u);
		s[u]+=(1+s[v]);
	}
//	cout<<u<<" "<<s[u]<<endl;
}
int f[maxn][2];
void DP(int u,int fa){
	for(int i=0;i<T[u].size();i++){
		int v=T[u][i];
		if(v==fa)continue;
		DP(v,u);
		f[u][1]=f[u][1]*((2ll*f[v][0]%mod+f[v][1])%mod)%mod;
		f[u][1]=(f[u][1]+(f[u][0]*f[v][1])%mod)%mod;
		f[u][0]=f[u][0]*2ll%mod*f[v][0]%mod;
	}
	if(u==1)ans=(ans+f[u][1])%mod;
	else ans=(ans+f[u][1]*qpow(2,s[1]-s[u]-1)%mod)%mod;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
    	int u,v;
    	cin>>u>>v;
    	E[u].push_back(v);
    	E[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i,0);
	}
	for(int i=1;i<=n;i++){
		if(!vis[i])++DCCcount,DFS(i);
	}
	N=DCCcount;
	for(int u=1;u<=n;u++){
		for(set<int>::iterator it=del[u].begin();it!=del[u].end();it++){
			int v=*it;
			T[bel[u]].push_back(bel[v]);
		}
	}
	for(int i=1;i<=N;i++)Ve[i]=DCC[i].size();
	for(int i=1;i<=n;i++){
		for(int j=0;j<E[i].size();j++){
			int v=E[i][j];
			if(bel[i]==bel[v])Ed[bel[i]]++;
		}
	}
	for(int i=1;i<=N;i++){
		Ed[i]>>=1;
		f[i][0]=qpow(2,Ed[i]);
		f[i][1]=(qpow(2,Ve[i]+Ed[i])-qpow(2,Ed[i])+mod)%mod;
	}
	dfs(1,0);
	DP(1,0);
	cout<<ans<<endl;
	return 0;
}



2024/4/4 17:04
加载中...