[POI2007]POW-The Floodhttps://www.luogu.org/problemnew/show/P3457
????????????
\(AKD\) ??????????????????????????????????????????????????????????????????????????????,\(AKD\) ????????? ???????????????\(Blue Mary\),\(AKD\) ????????????,???????????????????????????(?????????)????????? ?????????????????????????????????????????????,????????????,???????????????????????????,???????????? ???????????????????????????,????????????????????? ?????????????????? \(AKD\) ??????????????????????????????????????? \(m*n\) ?????????,???????????? \(m*n\) ??? \(1*1\) ??????????????????????????????????????????,??????????????????????????????????????????????????? ????????? \(AKD\) ??????????????????????????????????????????????????????????????????????????????,?????? ??????????????????????????????????????????????????????,??????????????????????????????????????????,??? ?????????????????????????????? \(AKD\) ??????????????? ???????????????????????????????????????????????? \(1*1\) ??????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????,??????????????????,???????????? ??????????????????????????????????????????,???????????????????????????????????????????????????????????? ??????,?????????????????????(????????????????????????????????????)???????????????
???????????????
????????????????????? \(m,n(1<=m,n<=1000)\). ?????? \(m\) ???,?????? \(n\) ??????,?????????????????????????????????????????????;???????????????,??? ????????? \(AKD\) ??????????????????;?????????????????? ???????????????:???????????????????????????????????????????????? \(1000\),???????????????.
???????????????
????????????,??????????????????,????????????????????????????????????????????????
???????????????
6 9
-2 -2 -1 -1 -2 -2 -2 -12 -3
-2 1 -1 2 -8 -12 2 -12 -12
-5 3 1 1 -12 4 -6 2 -2
-5 -2 -2 2 -12 -3 4 -3 -1
-5 -6 -2 2 -12 5 6 2 -1
-4 -8 -8 -10 -12 -8 -6 -6 -4
???????????????
2
??????:
????????????????????????????????????????????????,??????????????????,???????????????????????????[????????????]?????????????????????,???????????????????????????????????????[???????????????????????????????????????????????????????????????],???????????????????????????\(AKD\)?????????????????????????????????????????????,?????????\(Ans++\)
#define RG register
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int N=1005,NN=1e6+5;
inline int read()
{
RG int x=0,w=1;RG char ch=getchar();
while(ch<???0???||ch>???9???){if(ch==???-???)w=-1;ch=getchar();}
while(ch>=???0???&&ch<=???9???)x=x*10+ch-???0???,ch=getchar();
return x*w;
}
int m,n,H=-1,Ans,cnt,l=1,r;//??????????????????????????????
int A[4]={1,-1,0,0},B[4]={0,0,1,-1};
int a[N][N],b[N][N],fa[NN];
bool used[NN];
struct node{
int x,y,h;//????????????,????????????
bool c;//????????????AKD???
}undo[NN];
bool operator < (node A,node B)//?????????
{
return A.h>B.h;
}
priority_queue<node>Q;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
fa[y]=x;
if(used[y])used[x]=true;
}
int main()
{
n=read();
m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fa[m*(i-1)+j]=m*(i-1)+j;
a[i][j]=read();
b[i][j]=abs(a[i][j]);
Q.push((node){i,j,b[i][j],a[i][j]>0});
}
Q.push((node){1e9,1e9,1e9,1});//???????????????val???inf?????????,????????????????????????????????????????????????
while(!Q.empty())
{
node now=Q.top();Q.pop();
cnt++;
if(H<now.h)
{
H=now.h;
r=cnt-1;
for(int i=l;i<=r;i++)//????????????
{
int fi=find(m*(undo[i].x-1)+undo[i].y);
if(!used[fi]&&undo[i].c)Ans++,used[fi]=true;
}
l=cnt;
}
if(cnt==m*n+1)break;
for(int i=0;i<4;i++)
{
int xx=now.x+A[i],yy=now.y+B[i];
if(xx<1||xx>n||yy<1||yy>m)continue;
if(b[xx][yy]<=now.h)unite(m*(xx-1)+yy,m*(now.x-1)+now.y);//?????????
}
undo[cnt]=now;//??????undo??????,???????????????
}
printf("%d\n",Ans);
return 0;
}