为什么不能直接套最长不下降子序列板子呢
查看原帖
为什么不能直接套最长不下降子序列板子呢
836448
stylus楼主2024/11/19 17:21

rt

#include<bits/stdc++.h>
/*
不要以为你有后台你就可以乱看人代码,不要以为你有后台就乱来看别人。你没有代码!!!你,就是后台享有最高权力,你认为我是骂你的,你就抄吧,你甚至可以封我的号。但是,群众的眼睛是雪亮的!!!!
如果你看了我的代码,会让全天下的oiers知道,你的腐朽!!!
你将会臭名昭著!!!
*/
#define int long long
using namespace std;
void read(int &x){
    x=0;char c=getchar();bool f=0;
    while(c<48||c>'9'){
        if(c=='-')f=1;
        c=getchar();
    }do{x=(x<<3)+(x<<1)+(c^48),c=getchar();}while(c>=48&&c<='9');
    x=f?-x:x;
}
int n,m,a[100001],dp[100001],d[100001],x,y,z,p=-0x3f3f3f3f;
vector<int>v[100001];
void tp(){
	queue<int>q;
	for(int i=1;i<=n;i++)if(!d[i])q.push(i);
	while(q.size()){
		x=q.front();
		q.pop();
		for(auto i:v[x]){
			if(a[i]>=a[x])dp[i]=max(dp[i],dp[x]+1);
			d[i]--;
			if(!d[i])q.push(i);
		}
	}return;
}
signed main(){
	read(n),read(m);
	for(int i=1;i<=n;i++)read(a[i]),dp[i]=1;
	while(m--)read(x),read(y),v[x].push_back(y),d[y]++;
	tp();
	for(int i=1;i<=n;i++)p=max(dp[i],p);
	cout<<p;
    return 0;
}
2024/11/19 17:21
加载中...