题解:
我脑子里都是翔???
bfs一下就行了 我居然还想什么kd tree!真是too naive,,,
1 #include<cstdio> 2 3 #include<cstdlib> 4 5 #include<cmath> 6 7 #include<cstring> 8 9 #include<algorithm> 10 11 #include<iostream> 12 13 #include<vector> 14 15 #include<map> 16 17 #include<set> 18 19 #include<queue> 20 21 #include<string> 22 23 #define inf 1000000000 24 25 #define maxn 1000+5 26 27 #define maxm 200000+5 28 29 #define eps 1e-10 30 31 #define ll long long 32 33 #define pa pair<int,int> 34 35 #define for0(i,n) for(int i=0;i<=(n);i++) 36 37 #define for1(i,n) for(int i=1;i<=(n);i++) 38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42 43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 44 45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 46 47 #define mod 1000000007 48 49 using namespace std; 50 51 inline int read() 52 53 { 54 55 int x=0,f=1;char ch=getchar(); 56 57 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 58 59 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 60 61 return x*f; 62 63 } 64 int n,m,d[maxn][maxn]; 65 queue<pa>q; 66 bool v[maxn][maxn]; 67 const int dx[4]={0,1,-1,0}; 68 const int dy[4]={1,0,0,-1}; 69 70 int main() 71 72 { 73 74 freopen("input.txt","r",stdin); 75 76 freopen("output.txt","w",stdout); 77 78 n=read();m=read(); 79 for5(n,m)d[i][j]=inf; 80 for5(n,m) 81 { 82 char ch=getchar(); 83 while(ch!='0'&&ch!='1')ch=getchar(); 84 if(ch=='1'){d[i][j]=0;q.push(pa(i,j));} 85 } 86 while(!q.empty()) 87 { 88 int x=q.front().first,y=q.front().second;q.pop(); 89 for0(i,3) 90 { 91 int xx=x+dx[i],yy=y+dy[i]; 92 if(xx<1||xx>n||yy<1||yy>m||d[xx][yy]<=d[x][y])continue; 93 d[xx][yy]=d[x][y]+1; 94 if(!v[xx][yy]){v[xx][yy]=1;q.push(pa(xx,yy));} 95 } 96 } 97 for1(i,n){for1(j,m)printf("%d ",d[i][j]);printf(" ");} 98 99 return 0; 100 101 }
1 #include<cstdio> 2 3 #include<cstdlib> 4 5 #include<cmath> 6 7 #include<cstring> 8 9 #include<algorithm> 10 11 #include<iostream> 12 13 #include<vector> 14 15 #include<map> 16 17 #include<set> 18 19 #include<queue> 20 21 #include<string> 22 23 #define inf 1000000000 24 25 #define maxn 2000000+5 26 27 #define maxm 200000+5 28 29 #define eps 1e-10 30 31 #define ll long long 32 33 #define pa pair<int,int> 34 35 #define for0(i,n) for(int i=0;i<=(n);i++) 36 37 #define for1(i,n) for(int i=1;i<=(n);i++) 38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42 43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 44 45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 46 47 #define mod 1000000007 48 49 using namespace std; 50 51 inline int read() 52 53 { 54 55 int x=0,f=1;char ch=getchar(); 56 57 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 58 59 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 60 61 return x*f; 62 63 } 64 int n,m,a[1005][1005],ans,rt,tot; 65 struct rec 66 { 67 int d[2],mi[2],mx[2],l,r; 68 int& operator[](int i){return d[i];} 69 }now,t[maxn]; 70 inline void pushup(int k) 71 { 72 int l=t[k].l,r=t[k].r; 73 for0(i,1) 74 { 75 t[k].mi[i]=min(t[k].mi[i],min(t[l].mi[i],t[r].mi[i])); 76 t[k].mx[i]=max(t[k].mx[i],max(t[l].mx[i],t[r].mx[i])); 77 } 78 } 79 inline void insert(int &k,int dir) 80 { 81 if(!k) 82 { 83 k=++tot;t[tot]=now; 84 for0(i,1)t[tot].mi[i]=t[tot].mx[i]=t[tot][i]; 85 return; 86 } 87 if(now[dir]<t[k][dir])insert(t[k].l,dir^1);else insert(t[k].r,dir^1); 88 pushup(k); 89 } 90 inline int dist(rec a,rec b){return abs(a[0]-b[0])+abs(a[1]-b[1]);} 91 inline int get(int k) 92 { 93 if(!k)return inf; 94 int ret=0; 95 for0(i,1) 96 { 97 if(now[i]<t[k].mi[i])ret+=t[k].mi[i]-now[i]; 98 if(now[i]>t[k].mx[i])ret+=now[i]-t[k].mx[i]; 99 } 100 return ret; 101 } 102 inline void query(int k,int dir) 103 { 104 int dl=get(t[k].l),dr=get(t[k].r),d0=dist(t[k],now); 105 if(d0<ans)ans=d0; 106 if(dl<dr) 107 { 108 if(dl<ans)query(t[k].l,dir^1); 109 if(dr<ans)query(t[k].r,dir^1); 110 }else 111 { 112 if(dr<ans)query(t[k].r,dir^1); 113 if(dl<ans)query(t[k].l,dir^1); 114 } 115 } 116 int b[20]; 117 inline void print(int x) 118 { 119 if(!x)putchar('0'); 120 for(b[0]=0;x;x/=10)b[++b[0]]=x%10; 121 for3(i,b[0],1)putchar('0'+b[i]); 122 } 123 124 125 int main() 126 127 { 128 129 freopen("input.txt","r",stdin); 130 131 freopen("output.txt","w",stdout); 132 133 n=read();m=read(); 134 for1(i,n)for1(j,m) 135 { 136 char ch=getchar(); 137 while(ch!='0'&&ch!='1')ch=getchar(); 138 a[i][j]=ch-'0'; 139 if(ch=='1'){now[0]=i;now[1]=j;insert(rt,0);} 140 } 141 for1(i,n) 142 { 143 for1(j,m) 144 { 145 if(j!=1)putchar(' '); 146 if(a[i][j]==1)putchar('0'); 147 else {now[0]=i;now[1]=j;ans=inf;query(rt,0);print(ans);} 148 } 149 printf(" "); 150 } 151 152 return 0; 153 154 }
2252: [2010Beijing wc]矩阵距离
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 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
0001
0011
0110
Sample Output
3 2 1 0
2 1 0 0
1 0 0 1
2 1 0 0
1 0 0 1
HINT
对于100%的数据,满足 0 < m n <=1000