80分 MLE 求优化思路/请求开大空限
查看原帖
80分 MLE 求优化思路/请求开大空限
497817
羊摆摇楼主2025/1/20 19:18

能有不用链式前项星的优化思路吗,代码已经足够臃肿了
-_-

#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define pb emplace_back
#define fr first
#define sc second
typedef const int Int;
typedef pair<int,int> pii;

Int N=1e5+5;

vector <int> G[N];
vector <int> F[N];
vector <int> fF[N];
queue <int> Q;
bool vis[N];

int n,m;

int A[N];
int minn[N],maxn[N];

bool insta[N];
int sta[N],dfn[N],low[N],h,cnt;
int bel[N],bcnt;

int from,to;

inline void Rcd(Int &x){
	insta[x]=false;
	bel[x]=bcnt;
	if(x==1)from=bcnt;
	if(x==n)to=bcnt;
}

void dfs(Int &u){
	dfn[u]=low[u]=++cnt,sta[++h]=u,insta[u]=true;
	for(Int &v:G[u]){
		if(!dfn[v]){
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
		else if(insta[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		bcnt++;
		while(sta[h]^u)Rcd(sta[h--]);
		h--,Rcd(u);
	}
}

void mrk(Int &s){
	queue <int> q;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		vis[u]=true,q.pop();
		for(Int &v:fF[u])if(!vis[v])q.push(v);
	}
}

int ans;

int main(){
	memset(minn,0x3f,sizeof(minn));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&A[i]);
	for(int i=1;i<=m;i++){
		int u,v,t;
		scanf("%d%d%d",&u,&v,&t);
		if(t==2)G[v].pb(u);
		G[u].pb(v);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);
	for(int i=1;i<=n;i++){
		for(Int &v:G[i])if(!vis[v]&&bel[i]^bel[v])F[bel[i]].pb(bel[v]),fF[bel[v]].pb(bel[i]),vis[v]=true;
		for(Int &v:G[i])vis[v]=false;
		G[i].clear();
		minn[bel[i]]=min(minn[bel[i]],A[i]),maxn[bel[i]]=max(maxn[bel[i]],A[i]);
	}
	mrk(to);
	Q.push(from);
	while(!Q.empty()){
		int u=Q.front();
		Q.pop();
		ans=max(ans,maxn[u]-minn[u]);
		for(Int &v:F[u]){
			minn[v]=min(minn[u],minn[v]);
			if(vis[v])Q.push(v);
		}
	}
	printf("%d",ans);
	return 0;
}





















为什么只给125MiB啊QAQ

2025/1/20 19:18
加载中...