为什么只有20分?
查看原帖
为什么只有20分?
365777
halehu楼主2022/7/7 14:41

其他全部tle,除了1,4两点,难道广搜连n<=100,m<=100的数据都过不了吗?,明明复杂度是 nmmn * m * m

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
	int l,r;
}e[505];
int n,m,map[505][505],i,j,L,R,z,d[505],cnt=0,pos=1;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool cmp(node x,node y){
	if(x.l==y.l)return x.r>y.r;
	return x.l<y.l;
}
void bfs(int y){
	int vis[505][505];
	memset(vis,0,sizeof(vis));
	queue<int>qx,qy;
	qx.push(1),qy.push(i);
	vis[1][i]=1;
	while(!qx.empty())
	{
		int x=qx.front(),y=qy.front();
		qx.pop(),qy.pop();
		for(int k=0;k<4;k++){
			int xx=x+dx[k],yy=y+dy[k];
			if(!vis[xx][yy]&&map[xx][yy]<map[x][y]&&xx>0&&yy>0&&xx<=n&&yy<=m){
				vis[xx][yy]=1;
				qx.push(xx),qy.push(yy);
			}
		}
	}
	for(int k=1;k<=m+1;k++){
		if(e[i].l&&e[i].r)continue;
		if(!e[i].l&&vis[n][k])e[i].l=k;
		if(e[i].l&&!vis[n][k])e[i].r=k-1;
		if(!d[k]&&vis[n][k])d[k]=1;
	}
}
int main()
{
    cin>>n>>m;
	for(i=1;i<=n;i++)
	    for(j=1;j<=m;j++)
		    cin>>map[i][j];
	for(i=1;i<=m;i++)
		bfs(i);
	for(i=1;i<=m;i++)
		if(!d[i])
	       cnt++;
	if(cnt){
		cout<<0<<endl<<cnt<<endl;
		return 0;
	}
	sort(e+1,e+m+1,cmp);
	while(e[pos].l==0)pos++;
	L=e[pos].l,R=e[pos].r,pos++,cnt=1;
	while(R<m){
		int tmp=-1;
		for(i=pos;i<=m;i++){
			if(e[i].l>R){
				pos=i;
				break;
			}
			tmp=max(tmp,e[i].r);
		}
		R=tmp;
		cnt++;
	}
	cout<<1<<endl<<cnt<<endl;
	return 0;
} 
2022/7/7 14:41
加载中...