Powódź bzoj-5101 POI-2018

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

注释:$1\le n\times m\le 10^5$,$1\le H\le 10^9$。


想法:神题一道。

不好想啊不好想

如果水位高于两个块之间的墙那么这两个块我们称之为连通,用并查集维护。

这样的话我们将墙墙们按照高度排序。

每次如果墙左右的两个联通块不连通的话就连一起。

假设$g_x$为祖先为$x$的联通块内部的答案。这个答案的是以联通块内的最后一次完成内部合并的墙墙高度最大值。

再维护$h_x$为该联通块内的那个高度。

$val[i]$为当前枚举的墙墙高度。(墙墙已经被排好序了。

所以更新后:$g_x=(g_x+val[i]-h_x)\times(g_y+val[i]-h_y)$。

最后我们再加上$H-h[find(1)]$即可。

Code:

#include <bits/stdc++.h>
#define M 1000010
#define N 500010
#define mod 1000000007
using namespace std;
int f[N],g[N],h[N],cnt;
struct Node {int x,y,val;}a[M]; inline bool cmp_val(const Node &a,const Node &b) {return a.val<b.val;}
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
inline bool merge(int x,int y)
{
x=find(x); y=find(y);
if(x==y) return true;
f[y]=x; return false;
}
inline void add(int x,int y,int z) {a[++cnt].x=x,a[cnt].y=y,a[cnt].val=z;}
int main()
{
int n=rd(),m=rd(),H=rd(); for(int i=1;i<=n;i++)
{
for(int j=1;j<=m-1;j++) {int x=rd(); 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++) {int x=rd(); 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(a+1,a+cnt+1,cmp_val);
for(int i=1;i<=cnt;i++)
{
if(!merge(a[i].x,a[i].y))
{
int x=find(a[i].x),y=find(a[i].y);
g[x]=1ll*(g[x]+a[i].val-h[x])*(g[y]+a[i].val-h[y])%mod;
h[x]=a[i].val;
}
}
printf("%d\n",(g[find(1)]+H-h[find(1)])%mod);
return 0;
}

小结:并查集的应用好题。

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

  1. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  2. BZOJ_2303_[Apio2011]方格染色 _并查集

    BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...

  3. BZOJ_1015_[JSOI2008]星球大战_并查集

    BZOJ_1015_[JSOI2008]星球大战_并查集 题意:很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器, ...

  4. BZOJ_1998_[Hnoi2010]Fsk物品调度_并查集+置换

    BZOJ_1998_[Hnoi2010]Fsk物品调度_并查集+置换 Description 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置 ...

  5. BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集+树形DP

    BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集. Description 奶牛们遭到了进攻!在他们的共和国里,有N(1 <= N <=50,000)个城市,由M(1 ...

  6. [Comet OJ - Contest #6 D][48D 2280]另一道树题_并查集

    另一道树题 题目大意: 数据范围: 题解: 这个题第一眼能发现的是,我们的答案分成两种情况. 第一种是在非根节点汇合,第二种是在根节点汇合. 尝试枚举在第几回合结束,假设在第$i$回合结束的方案数为$ ...

  7. BZOJ_1015_星球大战_[JSOI2008]_(并查集)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1015 n 个点,被 m 条边相连.进行k次删点操作,问第一次操作前和每次操作后的集合数(直接或 ...

  8. BZOJ_1202_狡猾的商人_(并查集)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1202 n 个月的账单,共 m 组数据,每一组数据包括 x , y , t ,表示从 x 月到 ...

  9. POJ_1182_食物链_[NOI]_(并查集)

    描述  http://poj.org/problem?id=1182 共A,B,C三种动物,A吃B,B吃C,C吃A.给出询问 q : t , x , y , 表示: x 与 y 是同类 ( t==1 ...

随机推荐

  1. Android 实现对多个EditText的监听

    create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...

  2. JAVA一些错误代码

    //算术异常 ArithmeticExecption //空指针异常类 NullPointerException //类型强制转换异常 ClassCastException //数组负下标异常 Neg ...

  3. lua使用lfs.dll库进行文件操作

    在项目开发中,为了提高开发效率往往需要开发一些辅助工具.最近在公司用lua帮拓展了一个资源扫描的工具,这个工具的功能就是从原始demo下指定目标资源文件,对该文件进行读取并筛选过滤一遍然后拷贝到最终d ...

  4. Java集合框架源码(三)——arrayList

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  5. git 学习笔记1

    目前我属于粗放型的[学习者],接下来需要做一些改变,让自己更加规范.首先需要学习的就是版本控制系统,本科在工作室的时候使用过一点Subversion,不过到现在已经基本没有印象了.git现在越来越成为 ...

  6. iOS---开发实用传感器

    传感器 1.什么是传感器 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上 2.传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone中的下面现象都 ...

  7. 当前主要的常用的PHP环境部署套件比较

    当前主要的常用的PHP环境部署套件比较 作为新手,需要学习PHP,或者需要搭建PHP+MySQL运行环境时,就需要去找各种搭建方法,一步一步按照操作流程操作,不仅繁琐,而且容易出错,还会带来安全隐患. ...

  8. discuz 插件核心函数hookscript分析.

    function hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = ...

  9. Android学习——蓝牙通讯

    蓝牙蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术.能在包括移动电话.PDA.无线耳机.笔记本电脑等众多设备之间进行无线信息交换.利用“蓝牙”技术,能够有效的简化移动通信终端 ...

  10. viewport 640宽的做法 针对iphone和安卓单独设置

    <!DOCTYPE html> <html lang="ch"> <head> <meta charset="utf-8&quo ...