社区讨论

30PTS,TLE求调

P1514[NOIP 2010 提高组] 引水入城参与者 2已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mhj3ne3k
此快照首次捕获于
2025/11/03 20:11
4 个月前
此快照最后确认于
2025/11/03 20:11
4 个月前
查看原帖
怀疑是死循环了,但看了条件也没有发现在哪里。写的就是普通的BFS+区间覆盖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=505;
bool st[N][N][N];
bool jud[N];
int h[N][N];
int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct node
{
	int l;
	int r;
};
node a[N];
bool cmp(node x,node y)
{
	return x.l<y.l;
}
int main()
{
//	freopen("P1514_2.in","r",stdin);
//	freopen("ans.out","w",stdout);
	cin>>n>>m;
	int s=1;
	int t=m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>h[i][j];
		}
	}
	for(int i=1;i<=m;i++)
	{
		int ll=INT_MAX,rr=-INT_MAX;
		queue<PII>q;
		q.push({1,i});
		st[i][1][i]=true;
		while(q.size())
		{
			int tx=q.front().first;
			int ty=q.front().second;
			q.pop();
			if(tx==n)
			{
				jud[ty]=true;		
				ll=min(ll,ty);
				rr=max(rr,ty);
			}
			for(int j=0;j<=3;j++)
			{
				int kx=tx+dx[j];
				int ky=ty+dy[j];
				if(h[tx][ty]>h[kx][ky]&&kx>=1&&kx<=n&&ky>=1&&ky<=m&&!st[i][kx][ky])
				{
					st[i][kx][ky]=true;
					q.push({kx,ky});	
				}
			}					
		}
		if(ll==INT_MAX||rr==-INT_MAX)
		{
			a[i].l=-1;
			a[i].r=-1;
		}
		else
		{
			a[i].l=ll;
			a[i].r=rr;
		}
	}
	int cnt=0;
	for(int i=1;i<=m;i++)
	{	
		if(!jud[i])
			cnt++;
	}
	if(cnt)
	{
		cout<<'0'<<endl<<cnt;
		return 0;
	}
	
	int res=0;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int tmp=-INT_MAX;
		for(;i<=m;i++)
		{
			if(a[i].l>s)
			{
				i--;
				break;				
			}			
			if(a[i].l<=s&&a[i].r>=s)	
			{
				tmp=max(tmp,a[i].r);
			}	
		}
		s=tmp;
		res++;		
		if(s>=t)
			break;
	}
	cout<<'1'<<endl<<res;
	return 0;
}

回复

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

正在加载回复...