标签:stty vhd bat uap find car off ntp 合并
从前有一座岛屿,这座岛屿是一个长方形,被划为N*M的方格区域,每个区域都有一个确定的高度。不幸的是海平面开始上涨,在第i年,海平面的高度为t[i]。如果一个区域的高度小于等于海平面高度,则视为被淹没。那些没有被淹没的连通的区域够成一个连通块。现在问第i年,这样的连通块有多少个。
例如:第一年海平面高度为1,有2个连通块。
第二年海平面高度为2,有3个连通块。
4 5 1 2 3 3 1 1 3 2 2 1 2 1 3 4 3 1 2 2 2 2 5 1 2 3 4 5
2 3 1 0 0
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 3002; int map[maxn][maxn],id[maxn][maxn]; bool vis[maxn*maxn];int father[maxn*maxn]; #define LL long long int c; int n,m,q; struct node{ int x,y,high,id; }miku[maxn*maxn]; bool cmp(node a,node b) { return a.high>b.high; } LL ccnt=0,ans[maxn*1000];int t[maxn*1000],cnt=0; int fs[5]={1,0,-1,0,1}; inline int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } int pd(int x,int y) { vis[id[x][y]]=1; int tmp=0; for(int i=0;i<4;i++) { int xx=x+fs[i]; int yy=y+fs[i+1]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&vis[id[xx][yy]]) { int f1=find(id[x][y]),f2=find(id[xx][yy]); if(f1!=f2) { father[f2]=f1; tmp++; } } } return tmp; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]),miku[++cnt].high=map[i][j],miku[cnt].x=i,father[cnt]=cnt, miku[cnt].y=j; sort(miku+1,miku+cnt+1,cmp); for(int i=1;i<=cnt;i++) { id[miku[i].x][miku[i].y]=i; } scanf("%d",&q); for(int i=1;i<=q;i++) scanf("%d",&t[i]); int tmp=1; for(int k=q;k>=1;k--) { for(int i=tmp;i<=cnt;i++) { if(miku[i].high>t[k]) { if(!vis[i]) { ccnt++; ccnt-=pd(miku[i].x,miku[i].y); } } else { tmp=i; break; } } ans[k]=ccnt; } for(int i=1;i<=q;i++) printf("%lld ",ans[i]); return 0; }
标签:stty vhd bat uap find car off ntp 合并
原文地址:http://www.cnblogs.com/sssy/p/7208412.html