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