社区讨论
蒟蒻求助,为什么本地能过,但是洛谷测评却WA
P1514[NOIP 2010 提高组] 引水入城参与者 8已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mi6zmm7n
- 此快照首次捕获于
- 2025/11/20 13:25 4 个月前
- 此快照最后确认于
- 2025/11/20 13:25 4 个月前
难道我RE了???
请大佬们指教
代码如下:
思路就是暴力+线段覆盖
#include
#include
#include
#include
#include
#include
#define pa pair <int,int>
using namespace std;
const int N=510;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int n,m,mp[N][N],ans,size,cnt;
bool vis[N][N],flag=true;
queue q;
struct segment{
int l,r;
}mem[N];
bool cmp(segment x,segment y){
return x.l<y.l;
}
inline void read(int &x)
{
x=0;
char ch=getchar();
bool flag=0;
while('0'>ch||ch>'9')
{
if(ch=='-')
flag=1;
ch=getchar();
}
while('0'<=ch&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
if(flag)
x=-x;
}
void bfs()
{
while (!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for (int i=0;i<=3;i++)
{
if (x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m&&mp[x+dx[i]][y+dy[i]]<mp[x][y]&&!vis[x+dx[i]][y+dy[i]])
{
vis[x+dx[i]][y+dy[i]]=1;
q.push(make_pair(x+dx[i],y+dy[i]));
}
}
}
}
int main()
{
//freopen("xxx.in","r",stdin);
//freopen("xxx.out","w",stdout);
read(n),read(m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
read(mp[i][j]);
for (int i=1;i<=m;i++)
{
q.push(make_pair(1,i));
vis[1][i]=1;
}
while (!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for (int i=0;i<=3;i++)
{
if (x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m&&mp[x+dx[i]][y+dy[i]]<mp[x][y]&&!vis[x+dx[i]][y+dy[i]])
{
vis[x+dx[i]][y+dy[i]]=1;
q.push(make_pair(x+dx[i],y+dy[i]));
}
}
}
for (int i=1;i<=m;i++)
{
if (vis[n][i]==0)
{
flag=false;
cnt++;
}
}
if (flag==false)
{
printf("0\n");
printf("%d",cnt);
return 0;
}
else printf("1\n");
for (int i=1;i<=m;i++)
{
if (i==1&&mp[1][i]>=mp[1][i+1])
{
q.push(make_pair(1,i));
memset(vis,0,sizeof(vis));
vis[1][i]=true;
bfs();
bool flag1=false;
int l,r;
for (int j=1;j<=m;j++)
{
if (vis[n][j]==1&&!flag1)
{
l=j;flag1=true;
}
if (vis[n][j]==1)
r=j;
}
mem[++size].l=l;
mem[size].r=r;
continue;
}
if (i==m&&mp[1][i]>=mp[1][i-1])
{
q.push(make_pair(1,i));
memset(vis,0,sizeof(vis));
vis[1][i]=true;
bfs();
bool flag1=false;
int l,r;
for (int j=1;j<=m;j++)
{
if (vis[n][j]==1&&!flag1)
l=j,flag1=true;
if (vis[n][j]==1)
r=j;
}
mem[++size].l=l;
mem[size].r=r;
continue;
}
if (mp[1][i]>=mp[1][i-1]&&mp[1][i]>=mp[1][i+1])
{
q.push(make_pair(1,i));
memset(vis,0,sizeof(vis));
vis[1][i]=true;
bfs();
bool flag1=false;
int l,r;
for (int j=1;j<=m;j++)
{
if (vis[n][j]==1&&!flag1)
l=j,flag1=true;
if (vis[n][j]==1)
r=j;
}
mem[++size].l=l;
mem[size].r=r;
continue;
}
}
sort(mem+1,mem+1+size,cmp);
//for (int i=1;i<=size;i++)
// printf("%d,%d\n",mem[i].l,mem[i].r);
int last=1,far=0;
for (int i=1;i<=size;i++)
{
if (last>=m)
break;
if (mem[i].l>last)
{
ans++;
last=far;
far=max(far,mem[i].r);
}
else far=max(far,mem[i].r);
}
if (last>=m)
printf("%d",ans);
else printf("%d",ans+1);
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...