题目描述

在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水
箱与外界之间有一堵高度无穷大的墙,因此水不可能漏到外面。已知水箱内每个格子的高度都是[0,H]之间的整数
,请统计有多少可能的水位情况。因为答案可能很大,请对10^9+7取模输出。两个情况不同当且仅当存在至少一个
方格的水位在两个情况中不同。

输入

第一行包含三个正整数n,m,H(n*m<=500000,1<=H<=10^9)。
接下来n行,每行m-1个整数a[i][j](1<=a[i][j]<=H),表示(i,j)和(i,j+1)之间的墙的高度。
接下来n-1行,每行m个整数b[i][j](1<=b[i][j]<=H),表示(i,j)和(i+1,j)之间的墙的高度。

输出

输出一行一个整数,即方案数模10^9+7的结果。

样例输入

3 2 2
1
1
1
1 2
1 1

样例输出

65
HINT
要么全部格子水位都是2,要么全部格子水位都在[0,1]之间,共1+2^6=65种情况。
 
容易看出这是个网格图,将每个格子看作一个点,格子与格子间的墙看作是点与点之间的边,墙高就是边权。
对于每个点,只有与它相连的边权最小的边是有用的,在这个边权之下这个点的水位可以是任意的。
一旦超过了这个边权,那么这个点与那条边连向的点的水位就一定要保持相同了。
那么我们可以按边权从小到大的顺序合并每个点(或联通块),同时记录每个联通块里的最大边权以及每个联通块中的方案数。
因为一个联通块超过其中最大边后,联通块中每个点的水位都是一致的,所以当合并两个联通块时设两个联通块中的方案数分别是g1,g2;两个联通块中最大边分别是h1,h2,合并这两个联通块的边权为v,那么合并后得到的联通块的方案数就是(g1+v-h1)*(g1+v-h2)。
当所有联通块都合并之后(也就是所有点都连通之后)所有点的水位是一同升高的,只要把整个联通块的方案数加上H-最后一次合并的边权就好了。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,H;
int x;
int f[500010];
int tot;
ll g[500010];
int h[500010];
int mod=1e9+7;
struct node
{
int x;
int y;
int v;
}s[1000010];
int cnt;
void add(int x,int y,int v)
{
s[++cnt].x=x;
s[cnt].y=y;
s[cnt].v=v;
}
bool cmp(node s,node t)
{
return s.v<t.v;
}
int find(int x)
{
if(f[x]==x)
{
return x;
}
return f[x]=find(f[x]);
}
int main()
{
scanf("%d%d%d",&n,&m,&H);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m-1;j++)
{
scanf("%d",&x);
add((i-1)*m+j,(i-1)*m+j+1,x);
}
}
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
add((i-1)*m+j,i*m+j,x);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[(i-1)*m+j]=(i-1)*m+j;
g[(i-1)*m+j]=1;
}
}
sort(s+1,s+1+cnt,cmp);
for(int i=1;i<=cnt;i++)
{
int fx=find(s[i].x);
int fy=find(s[i].y);
if(fx!=fy)
{
g[fx]=(g[fx]+s[i].v-h[fx])*(g[fy]+s[i].v-h[fy])%mod;
f[fy]=fx;
h[fx]=s[i].v;
}
}
printf("%lld",(g[find(1)]+H-h[find(1)])%mod);
}

BZOJ5101[POI2018]Powódź——并查集的更多相关文章

  1. 【BZOJ5101】[POI2018]Powód 并查集

    [BZOJ5101][POI2018]Powód Description 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无 ...

  2. [bzoj5101][POI2018]Powódź_并查集

    Powódź bzoj-5101 POI-2018 题目大意:在地面上有一个水箱,它的俯视图被划分成了$n$行$m$列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无穷大 ...

  3. BZOJ5101 POI2018Powódź(并查集)

    如果某个格子的积水量超过了该格子的某个挡板高度,那么挡板另一端的积水量就会与其相同.看起来是一个不断合并的过程,考虑并查集.枚举深度,维护每个连通块内的方案数,深度超过某挡板高度时,将两端的连通块合并 ...

  4. BZOJ5101 : [POI2018]Powód

    求出Kruskal重构树,那么重构树上每个点的取值范围是定的. 考虑树形DP,则对于一个点,要么所有点水位相同,要么还未发生合并. 故$dp[x]=up[x]-down[x]+1+dp[l[x]]\t ...

  5. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  6. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  7. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  8. bzoj1854--并查集

    这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...

  9. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

随机推荐

  1. 【Codeforces 331D3】Escaping on Beaveractor

    题意:给\(b\times b\)的网格,其中有\(n\)个不交叉的箭头. 现在有\(q\)个询问,每个询问包含一个点\((x,y)\),以及一个方向\(dir\).时间\(t\). 要求从\((x, ...

  2. Subversion 1.8.9 ( SVN Client ) 安装最新版本的svn客户端

    For CentOS7 Users: [WandiscoSVN] name=Wandisco SVN Repo baseurl=http://opensource.wandisco.com/cento ...

  3. 走近SpringBoot

    (博客园不支持MarkDown编辑,看完整版请移步:https://www.zybuluo.com/Allen-llh/note/1199946) 1. (Building a RESTful Web ...

  4. Hive 实现 wordcount

    创建表: create table hive_wordcount(context string); load data local inpath '/home/hadoop/files/hellowo ...

  5. REST-framework快速构建API--生成Swagger接口文档

    一.Swagger概述 1.引言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档使用Word编写,or一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次接口有变更,需要手动修改 ...

  6. Zabbix监控系统部署:源码安装

    1. 概述1.1 基础环境2. 部署过程2.1 创建用户组2.2 下载源码解压编译安装2.2.1 下载源码解压2.2.2 YUM安装依赖环境2.2.3 编译安装最新版curl2.2.4 更新GNU构建 ...

  7. VS2010、VS2012、VS2013、VS2015、VS2017各版本产品激活秘钥

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...

  8. 阿里云Https通配符证书购买

    先付款,再绑定证书. 会款后会审核,等待... DNS解析配置错误 按域名授权配置,增加一条 DNS Txt记录值.

  9. linux下向一个文件中的某行插入数据的做法

    sed -i 'ni\x' test.file        表示向test.file文件里的第n行的前面添加x内容sed -i 'na\x' test.file       表示向test.file ...

  10. MySQL高可用架构-MMM环境部署记录

    MMM介绍MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理 ...