引水入城sol

引水入城

  • 可以从每一个第一行的位置出发记忆化搜索记录可以到达那些最后一行节点,但是空间开不下
  • 感性理解一下,每一个出发点到达的最后一行节点是连续的,所以只要记录\((l,r)\)即可
  • 在覆盖的时候,找到可以覆盖当前点中可以覆盖到最右边的点进行覆盖
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define U(i,u) for(register int i=head[u];i;i=nxt[i])
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define per(i,a,b) for(register int i=(a);i>=(b);--i)
#define Fast_cin ios::sync_with_stdio(false), cin.tie(0);
using namespace std;
typedef double db;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 ill;
typedef unsigned int ui;
typedef pair<int,int> PII;
typedef vector<int> VI;
template<class T> inline void read(T &x){x=0;char c=getchar();int f=1; while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f; }
template<class T> inline void print(T x) {if(x<0)putchar('-'),x =-x;if(x < 10)putchar(x + 48);else print(x/10),putchar(x%10+48);}
template<class T> inline void cmin(T &x, T y){x=x<y?x:y;}
template<class T> inline void cmax(T &x, T y){x=x>y?x:y;}
const int N=5e2+10;
int n,m,a[N][N],det[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int l[N][N],r[N][N],used[N][N],b[N][N];
void solve(int i,int j){
	used[i][j]=1;b[i][j]=1;
	if(l[i][j]<0x3f3f3f3f||r[i][j]){return;}
	if(i==n)l[i][j]=r[i][j]=j;
	rep(d,0,3){
		int di=i+det[d][0],dj=j+det[d][1];
		if(di>n||di<1||dj<1||dj>m)continue;
		if(used[di][dj])continue;
		if(a[di][dj]>=a[i][j])continue;
		solve(di,dj);
		cmin(l[i][j],l[di][dj]);cmax(r[i][j],r[di][dj]);
	}
}
int main(){
	read(n);read(m);rep(i,1,n)rep(j,1,m)read(a[i][j]);
	memset(l,0x3f,sizeof(l));
	memset(r,0,sizeof(r));
	rep(i,1,m){
		memset(used,0,sizeof(used));
		solve(1,i);
	}
	rep(i,1,m)if(!b[n][i]){
		printf("0\n");int tmp=0;
		rep(i,1,m)if(!b[n][i]){
			++tmp;
		}
		printf("%d",tmp);
		return 0;
	}
	printf("1\n");
	int tmp=0,le=1;
	while(le<=m){
		int mx=0;
		rep(i,1,m)if(l[1][i]<=le)cmax(mx,r[1][i]);
		++tmp;le=mx+1;
	}
	printf("%d",tmp);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/hangzz/p/13405615.html
今日推荐