社区讨论
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 条回复,欢迎继续交流。
正在加载回复...