level 7
喂TS猫薄荷的熊
楼主
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
bool p[103][103];
long l[103][103];
struct he
{ long x,y,d;
}h[10003];
long hs;
long str[10003][2],fx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int up(long i)
{ struct he ls;
while (h[i].d<h[i>>1].d)
{ ls=h[i];
h[i]=h[i>>1];
h[i>>1]=ls;
i>>=1;
}
return 0;
}
int down(long k)
{ long j;
struct he ls;
while ((k<<1)<=hs)
{ j=k<<1;
if (j<hs && h[j].d>h[j+1].d) ++j;
if (h[k].d>h[j].d)
{ ls=h[k];
h[k]=h[j];
h[j]=ls;
}
else break;
k=j;
}
return 0;
}
int main()
{ long i,j,k,m,n,su,hh,tt,o,q,ans=0;
scanf("%ld%ld",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
scanf("%ld",&l[i][j]);
for (i=1;i<=n;++i)
{ ++hs;
h[hs].x=i;
h[hs].y=1;
h[hs].d=l[i][1];
up(hs);
++hs;
h[hs].x=i;
h[hs].y=m;
h[hs].d=l[i][m];
up(hs);
}
for (j=2;j<m;++j)
{ ++hs;
h[hs].x=1;
h[hs].y=j;
h[hs].d=l[1][j];
up(hs);
++hs;
h[hs].x=n;
h[hs].y=j;
h[hs].d=l[n][j];
up(hs);
}
memset(p,1,sizeof(p));
for (i=2;i<n;++i)
for (j=2;j<m;++j)
p[i][j]=0;
su=(n-2)*(m-2);
while (su>0)
{ hh=0;
tt=1;
str[1][0]=h[1].x;
str[1][1]=h[1].y;
k=h[1].d;
h[1]=h[hs];
--hs;
down(1);
while (hh<tt)
{ ++hh;
for (i=0;i<4;++i)
{ o=str[hh][0]+fx[i][0];
q=str[hh][1]+fx[i][1];
if (!p[o][q])
{ p[o][q]=1;
--su;
if (l[o][q]<k)
{ ++tt;
str[tt][0]=o;
str[tt][1]=q;
ans+=k-l[o][q];
}
else
{ ++hs;
h[hs].x=o;
h[hs].y=q;
h[hs].d=l[o][q];
up(hs);
}
}
}
}
}
printf("%ld\n",ans);
system("pause");
return 0;
}
2011年06月29日 04点06分
1
#include<stdlib.h>
#include<string.h>
bool p[103][103];
long l[103][103];
struct he
{ long x,y,d;
}h[10003];
long hs;
long str[10003][2],fx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int up(long i)
{ struct he ls;
while (h[i].d<h[i>>1].d)
{ ls=h[i];
h[i]=h[i>>1];
h[i>>1]=ls;
i>>=1;
}
return 0;
}
int down(long k)
{ long j;
struct he ls;
while ((k<<1)<=hs)
{ j=k<<1;
if (j<hs && h[j].d>h[j+1].d) ++j;
if (h[k].d>h[j].d)
{ ls=h[k];
h[k]=h[j];
h[j]=ls;
}
else break;
k=j;
}
return 0;
}
int main()
{ long i,j,k,m,n,su,hh,tt,o,q,ans=0;
scanf("%ld%ld",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
scanf("%ld",&l[i][j]);
for (i=1;i<=n;++i)
{ ++hs;
h[hs].x=i;
h[hs].y=1;
h[hs].d=l[i][1];
up(hs);
++hs;
h[hs].x=i;
h[hs].y=m;
h[hs].d=l[i][m];
up(hs);
}
for (j=2;j<m;++j)
{ ++hs;
h[hs].x=1;
h[hs].y=j;
h[hs].d=l[1][j];
up(hs);
++hs;
h[hs].x=n;
h[hs].y=j;
h[hs].d=l[n][j];
up(hs);
}
memset(p,1,sizeof(p));
for (i=2;i<n;++i)
for (j=2;j<m;++j)
p[i][j]=0;
su=(n-2)*(m-2);
while (su>0)
{ hh=0;
tt=1;
str[1][0]=h[1].x;
str[1][1]=h[1].y;
k=h[1].d;
h[1]=h[hs];
--hs;
down(1);
while (hh<tt)
{ ++hh;
for (i=0;i<4;++i)
{ o=str[hh][0]+fx[i][0];
q=str[hh][1]+fx[i][1];
if (!p[o][q])
{ p[o][q]=1;
--su;
if (l[o][q]<k)
{ ++tt;
str[tt][0]=o;
str[tt][1]=q;
ans+=k-l[o][q];
}
else
{ ++hs;
h[hs].x=o;
h[hs].y=q;
h[hs].d=l[o][q];
up(hs);
}
}
}
}
}
printf("%ld\n",ans);
system("pause");
return 0;
}