社区讨论

求助ABC E

学术版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lr24ow3j
此快照首次捕获于
2024/01/06 21:56
2 年前
此快照最后确认于
2024/01/07 09:19
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,u,v,ans[200005][2],s[200005],fa[200005],sum[200005];
vector<int>g[200005],t[200005];
int find(int x){
	if(fa[x]==x)
		return x;
	return fa[x]=find(fa[x]);
}
struct node{
	int x,idx;
	bool operator<(const node t)const{
		if(x==t.x)
			return idx<t.idx;
		return x<t.x;
	}
}a[200005];
signed main(){
	memset(ans,-0x3f,sizeof ans);
	memset(sum,-0x3f,sizeof sum);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		fa[i]=i,scanf("%lld",&a[i].x),a[i].idx=i,s[i]=a[i].x;
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&u,&v);
		if(a[u].x>a[v].x)
			g[v].push_back(u);
		else if(a[u].x<a[v].x)
			g[u].push_back(v);
		else{
			int fx=find(u),fy=find(v);
			fa[fy]=fx;
		}
	}
	for(int i=1;i<=n;i++)
		t[find(i)].push_back(i);
	sort(a+1,a+n+1);
	bool f=false;
	for(int i=n;i>=1;i--){
		if(a[i].idx==n){
			f=true;
			ans[a[i].idx][0]=1;
			sum[find(a[i].idx)]=max(sum[find(a[i].idx)],ans[a[i].idx][0]);
			continue;
		}
		if(!f)
			continue;
		for(auto &&v:g[a[i].idx])
			ans[a[i].idx][0]=max(ans[a[i].idx][0],ans[v][0]+1);//,cout<<v<<' '<<ans[v][0]<<' '<<a[i].idx<<' '<<ans[a[i].idx][0]<<endl;
//		cout<<ans[a[i].idx][0]<<' '<<a[i].idx<<endl;
		sum[find(a[i].idx)]=max(sum[find(a[i].idx)],ans[a[i].idx][0]);
	}
	f=false;
	for(int i=n;i>=1;i--){
		if(a[i].idx==n){
			ans[a[i].idx][1]=1;
			f=true;
			continue;
		}
		if(!f)
			continue;
		ans[a[i].idx][1]=sum[find(a[i].idx)];
		for(auto &&v:g[a[i].idx])
			ans[a[i].idx][1]=max(ans[a[i].idx][1],max(ans[v][0],ans[v][1])+1);//,cout<<a[i].idx<<' '<<ans[a[i].idx][1]<<' '<<v<<' '<<ans[v][1]<<endl;
	}
	printf("%lld",max(0ll,ans[1][1]));
	return 0;
}

AC71,WA24

回复

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

正在加载回复...