题解:

我脑子里都是翔???

bfs一下就行了 我居然还想什么kd tree!真是too naive,,,

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 1000+5

 #define maxm 200000+5

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,m,d[maxn][maxn];
queue<pa>q;
bool v[maxn][maxn];
const int dx[]={,,-,};
const int dy[]={,,,-}; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();
for5(n,m)d[i][j]=inf;
for5(n,m)
{
char ch=getchar();
while(ch!=''&&ch!='')ch=getchar();
if(ch==''){d[i][j]=;q.push(pa(i,j));}
}
while(!q.empty())
{
int x=q.front().first,y=q.front().second;q.pop();
for0(i,)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<||xx>n||yy<||yy>m||d[xx][yy]<=d[x][y])continue;
d[xx][yy]=d[x][y]+;
if(!v[xx][yy]){v[xx][yy]=;q.push(pa(xx,yy));}
}
}
for1(i,n){for1(j,m)printf("%d ",d[i][j]);printf("\n");} return ; }
 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 2000000+5

 #define maxm 200000+5

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,m,a[][],ans,rt,tot;
struct rec
{
int d[],mi[],mx[],l,r;
int& operator[](int i){return d[i];}
}now,t[maxn];
inline void pushup(int k)
{
int l=t[k].l,r=t[k].r;
for0(i,)
{
t[k].mi[i]=min(t[k].mi[i],min(t[l].mi[i],t[r].mi[i]));
t[k].mx[i]=max(t[k].mx[i],max(t[l].mx[i],t[r].mx[i]));
}
}
inline void insert(int &k,int dir)
{
if(!k)
{
k=++tot;t[tot]=now;
for0(i,)t[tot].mi[i]=t[tot].mx[i]=t[tot][i];
return;
}
if(now[dir]<t[k][dir])insert(t[k].l,dir^);else insert(t[k].r,dir^);
pushup(k);
}
inline int dist(rec a,rec b){return abs(a[]-b[])+abs(a[]-b[]);}
inline int get(int k)
{
if(!k)return inf;
int ret=;
for0(i,)
{
if(now[i]<t[k].mi[i])ret+=t[k].mi[i]-now[i];
if(now[i]>t[k].mx[i])ret+=now[i]-t[k].mx[i];
}
return ret;
}
inline void query(int k,int dir)
{
int dl=get(t[k].l),dr=get(t[k].r),d0=dist(t[k],now);
if(d0<ans)ans=d0;
if(dl<dr)
{
if(dl<ans)query(t[k].l,dir^);
if(dr<ans)query(t[k].r,dir^);
}else
{
if(dr<ans)query(t[k].r,dir^);
if(dl<ans)query(t[k].l,dir^);
}
}
int b[];
inline void print(int x)
{
if(!x)putchar('');
for(b[]=;x;x/=)b[++b[]]=x%;
for3(i,b[],)putchar(''+b[i]);
} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();
for1(i,n)for1(j,m)
{
char ch=getchar();
while(ch!=''&&ch!='')ch=getchar();
a[i][j]=ch-'';
if(ch==''){now[]=i;now[]=j;insert(rt,);}
}
for1(i,n)
{
for1(j,m)
{
if(j!=)putchar(' ');
if(a[i][j]==)putchar('');
else {now[]=i;now[]=j;ans=inf;query(rt,);print(ans);}
}
printf("\n");
} return ; }

2252: [2010Beijing wc]矩阵距离

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 529  Solved: 255
[Submit][Status]

Description

假设我们有矩阵,其元素值非零即1

a11…… a1m

…………….

an1…….anm

定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L) 

Input

输入文件的第一行为两个整数,分别代表n和m。
接下来的n行,第i行的第 j个字符代表aij

Output

输出包含N行,每行M个用空格分开的数字,其中第i行第J个数字代表
Min(D(aij,axy) 1<=x<=N 1<=y<m,且axy=1

Sample Input

3 4
0001
0011
0110

Sample Output

3 2 1 0
2 1 0 0
1 0 0 1

HINT

对于100%的数据,满足 0 <  m n <=1000

BZOJ2252: [2010Beijing wc]矩阵距离的更多相关文章

  1. 【BFS】bzoj2252 [2010Beijing wc]矩阵距离

    要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止. #include<cstdio> #include<queue> #include ...

  2. Bzoj 2252: [2010Beijing wc]矩阵距离 广搜

    2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 563  Solved: 274[Submit][ ...

  3. BZOJ 2252: [2010Beijing wc]矩阵距离

    题目 2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MB Description 假设我们有矩阵,其元素值非零即1 ...

  4. bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不 ...

  5. bzoj 2251: [2010Beijing Wc]外星联络 后缀数组

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[Submit][ ...

  6. BZOJ 2251: [2010Beijing Wc]外星联络

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][ ...

  7. 【BZOJ2251】[2010Beijing Wc]外星联络 后缀数组

    [BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是, ...

  8. 2251: [2010Beijing Wc]外星联络

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 801  Solved: 481[Submit][ ...

  9. BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组

    BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...

随机推荐

  1. 微信公众账号怎么获取微信原始ID

    阅读号获取如下,服务号不确定,见图: 进入你的微信公众账号的地址(https://mp.weixin.qq.com ),登录之后进入如下

  2. Fixing:insert_modules not found

    搞linux的最怕的就是panic.满屏的报错不知头绪,百度出来的还都是抄来抄去的垃圾. 我遇到的错误已经解决,所以不想再看到报错了..google出来两个没有上下文的文本,因为和他们差不多,在下面贴 ...

  3. Matlab中cellfun函数的使用

    Compute the mean of each vector in cell array C. C = {1:10, [2; 4; 6], []}; averages = cellfun(@mean ...

  4. Eclipse 中Alt+/快捷键失效的解决办法。

    1.Eclipse下进入Windows ->Preperences ->General ->keys2.把word completion的快捷键设置alt+/删掉! 3.把Conte ...

  5. 原码 & 反码 & 补码 & 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  6. Longest Repeated Sequence【微软编程一小时-题目2】

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a sequence of integers, A = a1, a2, ... an. A c ...

  7. POJ 3258

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5961   Accepted: 2579 D ...

  8. FFMpeg那些事——独立运行的二进制文件ffmpeg编译

    想编译一个Android可用的二进制文件(要求:支持libx264/liblamemp3) github资源: 1.首先编译一个带lame库的ffmpeg https://github.com/aks ...

  9. Linux Shell 数字计算与比较

    直接上脚本, 使用$(())以及$[]进行数字计算 数值比较:n1 -eq n2检查n1是否等于n2         n1 -le n2检查n1是否小于等于n2n1 -ge n2检查n1是否大于等于n ...

  10. Java学习笔记之:Java String类

    一.引言 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String str= "Hello w ...