求助,神奇的TLE
查看原帖
求助,神奇的TLE
500031
FJ_OIer楼主2024/9/11 21:05

是拿到CF上面提交的,TLE on 4#

#include <bits/stdc++.h>
#define N 200005
using namespace std;
int t,n,m,u,v,cnt,tot;
int a[N],dfn[N],low[N],scc[N],g[N],in[N],f[N];
long long l[N],w[N];
bool instack[N];
stack<int> sta;
vector<int> e[N],edge[N];
void init(){
	cnt=tot=0;
	memset(dfn,0,sizeof dfn);
	memset(low,0,sizeof low);
	memset(scc,0,sizeof scc);
	memset(w,0,sizeof w);
	memset(in,0,sizeof in);
	memset(g,0,sizeof g);
	memset(instack,0,sizeof instack);
	for (int i=1;i<=n;i++){
		e[i].clear();
		edge[i].clear();
	}
}
void tarjan(int u){
	dfn[u]=low[u]=++cnt;
	instack[u]=1;
	sta.push(u);
	for (int v:e[u]){
		if (!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if (instack[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if (low[u]==dfn[u]){
		tot++;
		int tp=0;
		while (tp!=u){
			tp=sta.top();
			scc[tp]=tot;
			w[tot]+=a[tp];
			g[tot]++;
			instack[tp]=0;
			sta.pop();
		}
	}
}
void topo(){
	queue<int> q;
	int len=0;
	long long ans=LONG_LONG_MAX;
	memset(l,0,sizeof l);
	memset(f,0,sizeof f);
	for (int i=1;i<=tot;i++){
		if (!in[i]){
			q.push(i);
			f[i]=g[i];
			l[i]=w[i];
			len=max(len,f[i]);
		}
	}
	while (!q.empty()){
		int u=q.front();
		q.pop();
		for (int v:edge[u]){
			in[v]--;
			if (f[u]+g[v]>f[v]){
				f[v]=f[u]+g[v];
				l[v]=l[u]+w[v];
				len=max(len,f[v]);
			}else if (f[u]+g[v]==f[v]){
				l[v]=min(l[v],l[u]+w[v]);
			}
			if (!in[v]){
				q.push(v);
			}
		}
	}
	for (int i=1;i<=tot;i++){
		if (f[i]==len){
			ans=min(ans,l[i]);
		}
	}
	cout<<len<<" "<<ans<<endl;
}
signed main(){
	for (cin>>t;t;t--){
		init();
		cin>>n>>m;
		for (int i=1;i<=n;i++){
			cin>>a[i];
		}
		while (m--){
			cin>>u>>v;
			if (u==v){
				continue;
			}
			e[u].push_back(v);
		}
		for (int i=1;i<=n;i++){
			if (!dfn[i]){
				tarjan(i);
			}
		}
		for (int u=1;u<=n;u++){
			//cout<<u<<" "<<scc[u]<<endl;
			for (int v:e[u]){
				if (scc[u]==scc[v]){
					continue;
				}
				//cout<<scc[u]<<" "<<scc[v]<<endl;
				edge[scc[u]].push_back(scc[v]);
				in[scc[v]]++;
			}
		}
		topo();
	}
}
2024/9/11 21:05
加载中...