刚学OI0.001ms的蒟蒻55pts,悬棺求调
查看原帖
刚学OI0.001ms的蒟蒻55pts,悬棺求调
892084
xinxin2022楼主2024/9/18 19:22
#include<bits/stdc++.h>
using namespace std;
int n,m,a[250005];
int x[]={1,0,0,-1};
int y[]={0,1,-1,0};
vector<int> p[250005];
bool v[250005],k[250005];
int low[250005];
int DFN[250005];
int res[250005];
int in[250005],out[250005];
stack<int> s;
int cnt,cnt2,ans1,ans2;
bool check(int ak){
    if(k[ak]) return 0;
    if(int(ceil(ak/m))<1||int(ceil(ak/m))>n||(int(ak/m)==n&&ak%m)) return 0;
	return 1;
}
void bfs(int now){
	v[now]=1;
    k[now]=1;
	for(int i=0;i<4;i++){
	    if(a[now]<=a[now+x[i]*m+y[i]]&&!v[now+x[i]*m+y[i]]) p[now+x[i]*m+y[i]].push_back(now);
		if(check(now+x[i]*m+y[i])){
			if(a[now]>=a[now+x[i]*m+y[i]]){
				bfs(now+x[i]*m+y[i]);
				p[now].push_back(now+x[i]*m+y[i]);
			}
		}
	}
    v[now]=0;
}
void tarjan(int now){
	cnt++;
	low[now]=cnt;
	DFN[now]=cnt;
	s.push(now);
	v[now]=1;
	for(int i=0;i<p[now].size();i++){
		if(!DFN[p[now][i]]){
			tarjan(p[now][i]);
			low[now]=min(low[now],low[p[now][i]]);
		}
		else if(v[p[now][i]]){
			low[now]=min(low[now],DFN[p[now][i]]);
		}
	}
	if(DFN[now]==low[now]){
		cnt2++;
		int k=s.top();
		do{
			k=s.top();
			s.pop();
			v[k]=0;
			res[k]=cnt2;
		}while(k!=now);
	}
}
int main(){
	cin>>n>>m;
	swap(n,m);
	for(int i=1;i<=n*m;i++) cin>>a[i];
	for(int i=1;i<=n*m;i++){
		if(!k[i]) bfs(i);
	}
	memset(v,0,sizeof(v));
	for(int i=1;i<=n*m;i++){
		if(!DFN[i]) tarjan(i);
	}
    /*for(int i=1;i<=n*m;i++){
        for(int j:p[i]) cout<<j<<" ";
        cout<<'\n';
    }*/
	for(int i=1;i<=n*m;i++){
		for(auto j:p[i]){
			if(res[i]==res[j]) continue;
			in[res[j]]++;
			out[res[i]]++;
		}
	}
	for(int i=1;i<=cnt2;i++){
	    if(!in[i]) ans1++;
	    if(!out[i]) ans2++;
	}
    if(cnt2==1) cout<<0;
	else cout<<max(ans1,ans2);
	return 0;
}
2024/9/18 19:22
加载中...