BZOJ2252: [2010Beijing wc]矩阵距离

题解:

我脑子里都是翔???

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("\n");}
 98 
 99     return 0;
100 
101 }  
View Code
  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("\n");
150     }
151 
152     return 0;
153 
154 }  
View Code

2252: [2010Beijing wc]矩阵距离

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

Description

 

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

a11…… a1m

…………….

an1…….anm

 

定义aijakl之间的距离为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

 

posted @ 2015-01-21 16:31  ZYF-ZYF  Views(245)  Comments(0Edit  收藏  举报