服了这个傻逼卡常了
查看原帖
服了这个傻逼卡常了
1291285
封禁用户楼主2024/7/14 16:26

悬赏 2 个关注

md 调了好长时间,一直 TLE:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int N=1e6+5;
int n,m,ss;
vector<pair<long,long> > G[N],g[N];
long long dfn[N],low[N],in_stack[N],scc[N],val[N],dp[N];
stack<int> s;
long long cnt,ll;
void Tarjan(int u){
	dfn[u]=low[u]=++cnt;
	s.push(u);
	in_stack[u]=1;
	for(auto [v,va]:G[u]){
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(in_stack[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}if(dfn[u]==low[u]){
		++ll;
		while(s.top()!=u){
			in_stack[s.top()]=0;
			scc[s.top()]=ll;
			s.pop();
		}
		in_stack[s.top()]=0;
		s.pop();
		scc[u]=ll;
	}
	return ;
}
void dfs(int u){
    if(dp[u]!=-1) return;
    dp[u]=0;
    for(auto [v,w]:g[u]) dfs(v),dp[u]=max(dp[u],dp[v]+w);
    dp[u]+=val[u];
}
signed main(){
    n=read();
    m=read();
	int u,v,w;
	while(m--){
	    u=read();
	    v=read();
	    w=read();
		G[u].push_back({v,w});
	}
	for(int i=1;i<=n;++i){
		if(!dfn[i]){
		    Tarjan(i);
		}
	}
	ss=read();
	for(int u=1;u<=n;++u){
		for(auto [i,va]:G[u]){
			if(scc[i]!=scc[u]){
				g[scc[u]].push_back({scc[i],va});
			}else{
				int qaz=0;
				while(va>=0){
					val[scc[u]]+=va;
					++qaz;
					va-=qaz;
				}
			}
		}
	}
	for(int i=0;i<=ll;++i) dp[i]=-1;
	dfs(scc[ss]);
	printf("%lld",dp[scc[ss]]);
	return 0;
}
2024/7/14 16:26
加载中...