BZOJ1104 [POI2007]洪水pow——并查集+乱搞
2017-07-04 18:08
246 查看
POI2007 洪水pow
乍一眼还以为是水题,仔细一看发现还是有点难度的。。
首先我们考虑对于节点x,如果他上下左右的点有一个点已经放了抽水机且海拔比x低,则x不需要放抽水机。或者我们可以认为我们花费代价0在x这个节点上放了一个抽水机
那么我们把所有点关于海拔排序,那么依次加入高度为h的点后去判断一下有没有与已经放了抽水机的点相连,如果没有则答案+1,并且在该点放上一个抽水机
这个操作可以用并查集或者直接BFS实现。。BFS感觉非城市节点的处理还是有点麻烦,所以我懒、、用并查集
温馨提示:注意卡常,我29s过的卧槽。。。
乍一眼还以为是水题,仔细一看发现还是有点难度的。。
首先我们考虑对于节点x,如果他上下左右的点有一个点已经放了抽水机且海拔比x低,则x不需要放抽水机。或者我们可以认为我们花费代价0在x这个节点上放了一个抽水机
那么我们把所有点关于海拔排序,那么依次加入高度为h的点后去判断一下有没有与已经放了抽水机的点相连,如果没有则答案+1,并且在该点放上一个抽水机
这个操作可以用并查集或者直接BFS实现。。BFS感觉非城市节点的处理还是有点麻烦,所以我懒、、用并查集
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <queue> #include <string> #include <map> #include <cstring> #include <ctime> #include <vector> #define inf 1e9 #define ll long long #define maxn 20010 #define For(i,j,k) for(int i=j;i<=k;i++) #define Dow(i,j,k) for(int i=k;i>=j;i--) using namespace std; inline void read(int &tx){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} tx=x*f; } inline void write(ll x){ if (x<0) putchar('-'),x=-x; if (x>=10) write(x/10); putchar(x%10+'0'); } inline void writeln(ll x){write(x);puts("");} int dx[]={0,1,0,-1,0}; int dy[]={0,0,1,0,-1}; struct node{int x,y,v;}rou[1000001],cit[1000001]; bool ok[1000001]; int n,m,h[1011][1011],F[1000001],ans,tot,tot1; inline bool cmp(node x,node y){return x.v<y.v;} inline int c(int x,int y){return (x-1)*m+y;} inline int get(int x){return x==F[x]?F[x]:F[x]=get(F[x]);} inline void merge(int x,int y) { int tx=get(x),ty=get(y); if(tx==ty) return; F[ty]=tx; } int main() { read(n);read(m); tot1=n*m; For(i,1,n) For(j,1,m) { read(h[i][j]); if(h[i][j]>0) { cit[++tot].x=i;cit[tot].y=j; cit[tot].v=h[i][j]; }else h[i][j]=-h[i][j]; rou[c(i,j)].x=i;rou[c(i,j)].y=j; rou[c(i,j)].v=h[i][j]; } sort(cit+1,cit+tot+1,cmp); sort(rou+1,rou+tot1+1,cmp); int now=1; for(int i=0;i<=n+1;i++) h[i][0]=h[i][m+1]=inf; for(int i=0;i<=m+1;i++) h[0][i]=h[n+1][i]=inf; For(i,1,tot1) F[i]=i; For(i,1,tot) { for(;now<=tot1&&rou[now].v<=cit[i].v;now++) { int ny=rou[now].y,nx=rou[now].x; For(d,1,4) { int tx=nx+dx[d],ty=ny+dy[d]; if(h[tx][ty]<=h[nx][ny]) { ok[get(c(nx,ny))]|=ok[get(c(tx,ty))]; merge(c(nx,ny),c(tx,ty)); } } } if(!ok[get(c(cit[i].x,cit[i].y))]) ok[get(c(cit[i].x,cit[i].y))]=1,ans++; } writeln(ans); }
温馨提示:注意卡常,我29s过的卧槽。。。
相关文章推荐
- 【BZOJ】1104: [POI2007]洪水pow
- BZOJ1104 : [POI2007]洪水pow
- BZOJ 1104 POI2007 洪水pow 并查集
- BZOJ 1104: [POI2007]洪水pow 并查集
- bzoj1104 [POI2007]洪水pow
- [BZOJ]1104: [POI2007]洪水pow
- BZOJ 1104: [POI2007]洪水pow 并查集
- 并查集 - BZOJ 1104 [POI2007]洪水
- BZOJ1104: [POI2007]洪水pow
- 并查集 [POI2007]洪水pow
- [POI2007]洪水pow 并查集
- BZOJ1104: [POI2007]洪水pow
- [POI2007]洪水pow bfs
- [POI2007]洪水pow bfs
- 【bzoj】1100: [POI2007]对称轴osi
- BZOJ1109 : [POI2007]堆积木Klo
- BZOJ 1101 [POI2007]Zap 莫比乌斯反演
- BZOJ 1111 POI2007 四进制的天平
- [BZOJ1097][POI2007]旅游景点atr(状压dp)
- bzoj 1101: [POI2007]Zap