社区讨论
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 条回复,欢迎继续交流。
正在加载回复...