社区讨论

60pts拓扑求助

P1434[SHOI2002] 滑雪参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi4hpuef
此快照首次捕获于
2025/11/18 19:28
4 个月前
此快照最后确认于
2025/11/20 04:05
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[101][101],cnt[10001],f[10001],ans; 
queue<ll>q;
vector<ll>g[10001];
ll cal(ll x,ll y){return (x-1)*m+y;}
int main(){
	cin>>n>>m;
	for (ll i=1;i<=n;i++) for (ll j=1;j<=m;j++) cin>>a[i][j];
	for (ll i=1;i<=n;i++)
	for (ll j=1;j<m;j++){
		ll num1=cal(i,j),num2=num1+1;
		if (a[i][j]<a[i][j+1]) g[num2].push_back(num1),cnt[num1]++;
		else g[num1].push_back(num2),cnt[num2]++;
	}
	for (ll i=2;i<=n;i++)
	for (ll j=1;j<=m;j++){
		ll num1=cal(i,j),num2=num1-m;
		if (a[i][j]<a[i-1][j]) g[num2].push_back(num1),cnt[num1]++;
		else g[num1].push_back(num2),cnt[num2]++;
	} 
	for (ll i=1;i<=n*m;i++) if (cnt[i]==0) q.push(i),f[i]=1;
	while (q.size()){
		ll cur=q.front();
		q.pop();
		for (ll i=0;i<g[cur].size();i++){
			f[g[cur][i]]=max(f[g[cur][i]],f[cur]+1);
			cnt[g[cur][i]]--;
			if (cnt[g[cur][i]]==0) q.push(g[cur][i]);
		}
	}
	for (ll i=1;i<=n*m;i++) ans=max(ans,f[i]);
	cout<<ans;
}

回复

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

正在加载回复...