这题数据太水了...
查看原帖
这题数据太水了...
372024
Mryia楼主2022/10/26 19:16
#include <bits/stdc++.h>
using namespace std;
const int N = 114514;

struct Graph{
	int head[N],nxt[N*7],to[N*7];
	int cnt;
	void create_edge(int u,int v){
		cnt++;
		nxt[cnt]=head[u];
		head[u]=cnt;
		to[cnt]=v;
	}
};
struct cty{
	int mx,mn;
};
int n,m;
cty a[N];
Graph g[4];
int dfn[N];
int dfnm;
int scc[N];
bool vis[N];
map<int,int> mp;
void dfs1(int nw){
	if(vis[nw]) return ;
	vis[nw]=1;
	for(int i=g[0].head[nw];i;i=g[0].nxt[i]){
		dfs1(g[0].to[i]);
	}
	dfn[++dfnm]=nw;
	return ;
}
void dfs2(int nw,int w){
	if(vis[nw]) return ;
	vis[nw]=1;
	scc[nw]=w;
	for(int i=g[1].head[nw];i;i=g[1].nxt[i]){
		dfs2(g[1].to[i],w);
	}
}
int dfs3(int nw){
	if(vis[nw]) return -1;
	vis[nw]=1;
	for(int i=g[1].head[nw];i;i=g[1].nxt[i]){
		a[nw].mx=max(a[nw].mx,dfs3(g[1].to[i]));
	}
	return a[nw].mx;
}//max
int dfs4(int nw){
	if(vis[nw]) return 0x7f7f7f7f;
	vis[nw]=1;
	for(int i=g[1].head[nw];i;i=g[1].nxt[i]){
		a[nw].mn=min(a[nw].mn,dfs4(g[1].to[i]));
	}
	return a[nw].mn;
}//min

int main_arr(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].mx;
		a[i].mn=a[i].mx;
		scc[i]=i;
	}
	for(int i=1;i<=m;i++){
		int wa,ac,re;
		cin>>ac>>re>>wa;
		if(wa==1){
			g[0].create_edge(ac,re);
			g[1].create_edge(re,ac);
		}else{
			g[0].create_edge(ac,re);
			g[0].create_edge(re,ac);
			g[1].create_edge(ac,re);
			g[1].create_edge(re,ac);
		}
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]) {
			dfs1(i);
		}
	}
	memset(vis,0,sizeof(vis));
	for(int i=dfnm;i>=1;i--){
		if(!vis[dfn[i]]) dfs2(dfn[i],dfn[i]);
	}
	memset(vis,0,sizeof(vis));
	for(int i=dfnm;i>=1;i--){
		if(!vis[dfn[i]]) dfs3(dfn[i]);
	}
	memset(vis,0,sizeof(vis));
	for(int i=dfnm;i>=1;i--){
		if(!vis[dfn[i]]) dfs4(dfn[i]);
	}
	for(int i=1;i<=n;i++){
		for(int j=g[0].head[i];j;j=g[0].nxt[j]){
			if(mp[scc[i]]==scc[g[0].to[j]]){
				continue;
			}else if(scc[i]==scc[g[0].to[j]]){
				continue;
			}else {
				g[2].create_edge(scc[i],scc[g[0].to[j]]);
				g[3].create_edge(scc[g[0].to[j]],scc[i]);
				mp[scc[i]]=scc[g[0].to[j]];
			}
		}
	}
	return 0;
}
int mns[N],mxe[N];
void dfs5(int nw){
	if(vis[nw]) return ;
	mns[nw]=min(mns[nw],a[nw].mn);
	vis[nw]=1;
	for(int i=g[2].head[nw];i;i=g[2].nxt[i]){
		mns[g[2].to[i]]=min(min(mns[g[2].to[i]],a[g[2].to[i]].mn),mns[nw]);
		dfs5(g[2].to[i]);
	}
}
void dfs6(int nw){
	if(vis[nw]) return ;
	mxe[nw]=max(mxe[nw],a[nw].mx);
	vis[nw]=1;
	for(int i=g[3].head[nw];i;i=g[3].nxt[i]){
		mxe[g[3].to[i]]=max(max(mxe[g[3].to[i]],a[g[3].to[i]].mx),mxe[nw]);
		//这里漏了一个dfs6(g[3].to[i]); 
	}
}
int dp(){
	for(int i=1;i<=n;i++){
		if(scc[i]==i) mxe[i]=-1;
	}
	memset(mns,0x3f,sizeof(mns));
	memset(vis,0,sizeof(vis));
	dfs5(scc[1]);
	memset(vis,0,sizeof(vis));
	dfs6(scc[n]);
	int ans=0;
	for(int i=1;i<=n;i++){
		if(scc[i]==i){
			ans=max(ans,mxe[i]-mns[i]);
		}
	}
	cout<<ans;
	return 0;
}

int main(){
	//freopen("trade.in","r",stdin);
	//freopen("trade.out","w",stdout);
	main_arr();
	dp();
	return 0;
}

如题

这么一个犯了明显错误的程序(128行)

然后: 只能说太水了

2022/10/26 19:16
加载中...