社区讨论

20pts WA5个点 T3个点 大佬求调 QAQ

P1073[NOIP 2009 提高组] 最优贸易参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo10xio7
此快照首次捕获于
2023/10/22 13:24
2 年前
此快照最后确认于
2023/11/02 12:54
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define itn int
#define ll long long
#define Min(a,b) (a>b?b:a)
#define Max(a,b) (a<b?b:a)
using namespace std;
const int N=1e5+10;
const int M=5e5+10;
int n,m,val[N]; 
int minn=0x3f3f3f3f,maxx;
int low[N],dfn[N];
int mi[N],ma[N];
int scc[N],scnt,id;
struct no{
	int net,v;
}e[2*M];
int h[N],cnt; 
ll ans;
void add(int x,int y){
	cnt++;
	e[cnt].v=y;
	e[cnt].net=h[x];
	h[x]=cnt;
}
struct node{
	int net,v;
}sce[2*M];
int sch[N];
void scadd(int x,int y){
	cnt++;
	sce[cnt].v=y;
	sce[cnt].net=sch[x];
	sch[x]=cnt;
}
stack<int> st;	
void tarjan(int u){
	dfn[u]=low[u]= ++id;
	st.push(u);
	for(itn i=h[u];i;i=e[i].net ){
		int v=e[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=Min(low[u],low[v]);
		}else if(!scc[v]){
			low[u]=Min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u])
	{
		scc[u]= ++scnt;
		ma[scnt]=val[u];
		mi[scnt]=val[u];
		while(st.top()!=u){
			scc[st.top()]=scnt;
			ma[scnt]=Max(ma[scnt],val[st.top()]);
			mi[scnt]=Min(mi[scnt],val[st.top()]);
			st.pop();
		}
		st.pop();
 	}
}
void dfs(int u){
	if(u==scc[n]){	
		ans=Max(ans,ma[scc[n]]-minn); 
		if(maxx<ma[scc[n]]){
			maxx=ma[scc[n]];
			ans=Max(ans,maxx-minn);
		}
		return ;
	}
	for(int i=sch[u];i;i=sce[i].net){
		int v=sce[i].v;
		int tmpmi=minn;
		int tmpma=maxx;
		if(minn>mi[v]){
			minn=mi[v];
		}
		ans=Max(ans,ma[v]-minn);
		if(maxx<ma[v]){
			maxx=ma[v];
			ans=Max(ans,maxx-minn); 
		}
		dfs(v);
		minn= tmpmi;
		maxx=tmpma;
		cout<<"oerm";
	}
	return ;
}
int main(){
//	freopen("inin.in","r",stdin);
//	freopen("ooo.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
//		cin>>val[i];
		scanf("%d",&val[i]);
	} memset(mi,0x3f,sizeof mi);
	for(itn i=1;i<=m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
//		cin>>x>>y>>z;
		add(x,y);
		if(z==2){
			add(y,x);
		}
	}
	for(itn i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
	}}
	cnt=0;
	for(int u=1;u<=n;u++){
		for(int i=h[u];i;i=e[i].net){
			int v=e[i].v;
			if(scc[u]!=scc[v]){
				scadd(scc[u],scc[v]);
			}
		}
	}
	maxx=ma[scc[1]],minn=mi[scc[1]];
	dfs(scc[1]);
	printf("%lld\n",ans);
//	cout<<scnt<<"\n";
//	for(itn  i=1;i<=scnt;i++){
//		cout<<ma[i]<<" "<<mi[i]<<"\n";
//	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...