abc335E求hack悬赏关注
  • 板块学术版
  • 楼主ahumannickname
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/6 21:49
  • 上次更新2024/1/7 09:10:58
查看原帖
abc335E求hack悬赏关注
676598
ahumannickname楼主2024/1/6 21:49
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>e[200005];
vector<int>f[200005];
struct point
{
	int p,h;
};
bool cmp(point a,point b)
{
	return a.p<b.p;
}
int y[200005];
point d[200005];
int dp[200005];
bool vis[200005];
int srh(int x,int v)
{
	if(vis[x])
	{
		return dp[x];
	}
	vis[x]=true;
	dp[x]=max(dp[x],v);
	v=max(dp[x],v);
	for(int i=0;i<f[x].size();i++)
	{
		if(!vis[f[x][i]])
		{
			dp[x]=max(dp[x],srh(f[x][i],v));
		}
	}
	return dp[x];
}
int main()
{
	int n,m;
	cin>>n>>m;
	dp[1]=1;
	for(int i=2;i<=n;i++)
	{
		dp[i]=0;
		vis[i]=false;
	}
	for(int i=1;i<=n;i++)
	{
		cin>>d[i].p;
		y[i]=d[i].p;
		d[i].h=i;
	}
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	sort(d+1,d+n+1,cmp);
	int tmp=1;
	for(int i=1;i<=n;i++)
	{
		int k=d[i].h;
		for(int j=0;j<e[k].size();j++)
		{
			if(y[e[k][j]]<y[k])
			{
				dp[k]=max(dp[k],dp[e[k][j]]+1);
			}
		}
		if(i>=2&&d[i].p>d[i-1].p)
		{
			for(int j=tmp;j<i;j++)
			{
				int t=d[j].h;
				for(int l=0;l<e[t].size();l++)
				{
					if(y[e[t][l]]==y[t])
					{
						f[t].push_back(e[t][l]);
					}
				}
			}
			for(int j=tmp;j<i;j++)
			{
				srh(j,dp[j]);
			}
			tmp=i;
		}
	}
	for(int j=tmp;j<=n;j++)
	{
		int t=d[j].h;
		for(int l=0;l<e[t].size();l++)
		{
			if(y[e[t][l]]==y[t])
			{
				f[t].push_back(e[t][l]);
			}
		}
	}
	for(int j=tmp;j<=n;j++)
	{
		srh(j,dp[j]);
	}
	cout<<dp[n]<<endl;
	return 0;
}
2024/1/6 21:49
加载中...