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)之后被深深的打动,决心致力于寻 找外星人的 ...
随机推荐
- 《C++Primer》复习——with C++11 [3]
1.我们的程序经常使用很多IO库,用来输入输出例如:istream(输入流)类型,提供输入操作. ostream(输出流)类型, 提供输出操作. cin, 一个istream对象,从标准输入读取数据. ...
- [搜片神器]winform程序自己如何更新自己的方法代码
DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...
- SVN 安装配置
1,软件下载 到官方网站的下载二进制安装文件,来到二进制包下载部分,找到 Windows NT, 2000, XP and 2003部分,然后选择Apache 2.2 或者 Apache 2.4,这样 ...
- 不安装Oracle客户端远程连接Orcale数据库
本方法是通过使用ORACLE官方提供的精简版客户端,即绿色免安装的客户端. 下载地址(此处提供的是官方各版本下载地址): Windows 32位系统中使用的客户端下载地址其他系统环境中使用的客户端下载 ...
- UDP TCP 消息边界
先明确一个问题,如果定义了一个数据结构,大小是,比方说 32 个字节,然后 UDP 客户端连续向服务端发了两个包.现在假设这两个包都已经到达了服务器,那么服务端调用 recvfrom 来接收数据,并且 ...
- window dos 设置网络
->netsh ->pushd interface ip ->set address "本地连接" static 192.168.1.2 255.255.255. ...
- 判断不同IOS设备
var iOSGen = iPhone.generation; if (Debug.isDebugBuild) { Debug.Log("iPhone.generation : " ...
- 层次数据结构字符串处理,split函数使用
String str1 = "11@22#33,44,55,#bb#cc,dd,ee,#@DDD@TTT#999,#@"; String[] CX = str1.split(&qu ...
- POJ 1731
#include<iostream> #include<string> #include<algorithm> using namespace std; int m ...
- struts2-2.3.4.1的struts-default.xml源码
<?xml version="1.0" encoding="UTF-8" ?> <!-- /* * $Id: struts-default.x ...