• 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("
    ");}
     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("
    ");
    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

  • 相关阅读:
    ADSL自动更换IP的方法
    css框架 一个可控性强的css+xhtml页面布局生成器。
    Linux环境配置之LAMP搭建(源码安装)
    PHP小技巧
    Google首页电吉他源代码下载
    Jquery 插件可以用来操作定界窗,将在定界窗内选取的项目放到父窗口内
    今天見鬼了
    今天闲着没事去公园玩了一下,随手拍了几张
    PHP利用PHPMailer组件的Gmail发信能力发送电子邮件
    端午节放假去台湾中部山区野餐时照的
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4239252.html
Copyright © 2020-2023  润新知