BZOJ2252: [2010Beijing wc]矩阵距离
题解:
我脑子里都是翔???
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
0001
0011
0110
Sample Output
2 1 0 0
1 0 0 1
HINT
对于100%的数据,满足 0 < m n <=1000
BZOJ2252: [2010Beijing wc]矩阵距离的更多相关文章
- 【BFS】bzoj2252 [2010Beijing wc]矩阵距离
要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止. #include<cstdio> #include<queue> #include ...
- Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 563 Solved: 274[Submit][ ...
- BZOJ 2252: [2010Beijing wc]矩阵距离
题目 2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec Memory Limit: 256 MB Description 假设我们有矩阵,其元素值非零即1 ...
- bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不 ...
- bzoj 2251: [2010Beijing Wc]外星联络 后缀数组
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 424 Solved: 232[Submit][ ...
- BZOJ 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 795 Solved: 477[Submit][ ...
- 【BZOJ2251】[2010Beijing Wc]外星联络 后缀数组
[BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是, ...
- 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 801 Solved: 481[Submit][ ...
- BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...
随机推荐
- 关于拓扑排序(topologicalsort)
假设我们有一组任务要完成,并且有些任务要在其它任务完成之后才能开始,所以我们必须非常小心这些任务的执行顺序.如果这些任务的执行顺序足够简单的话,我们可以用链表来存储它们,这是一个很好的方案,让我们可以 ...
- nginx 如何显示真实ip
nginx做反向代理显示在后台访问的真实ip总是显示127.0.0.1 只要添加如下内容: proxy_set_header Host $host; proxy_set_header X-For ...
- 为什么数据可以从pl/sql查出来而使用ado.net查询,结果却是空?
1.背景 一条记录(如select * from A where a='1'),使用pl/sql作为条件可以查询出记录,但用ado.net sql查询结果却是空. 2.原因 a字段的数据类型的char ...
- C++字符串分割
//字符串分割函数 std::vector<std::string> split(std::string str,std::string pattern) { std::string::s ...
- Linux下tcp协议socket的recv函数返回时机分析(粘包)
http://www.vckbase.com/index.php/wv/10http://blog.csdn.net/zlzlei/article/details/7689409 文章一: 当前在网络 ...
- xargs 加 gm批量转换图片
%x50% @ ../-\ 南澳西涌_50%/@ 看了很多说明上都在用-i,这是一个已经废弃了的参数
- Unity3D 相关项目代码
一.Application.PresistentDataPath 注意最后面是没有/的 public static string PresistentDataPathForEditor = " ...
- HDU4612 Warm up 边双连通分量&&桥&&树直径
题目的意思很简单,给你一个已经连通的无向图,我们知道,图上不同的边连通分量之间有一定数量的桥,题目要求的就是要你再在这个图上加一条边,使得图的桥数目减到最少. 首先要做的就是找出桥,以及每个点所各自代 ...
- hdu 2717 Catch That Cow(BFS,剪枝)
题目 #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...
- Orcle数据库查询练习复习:四
一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...