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. ASP.NET Core MVC使用MessagePack配合前端fetch交换数据

    1.安装Nuget包 - WebApiContrib.Core.Formatter.MessagePack https://www.nuget.org/packages/WebApiContrib.C ...

  2. T4870 水灾(sliker.cpp/c/pas) 1000MS 64MB

    题目描述 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表 ...

  3. DOM简介及节点、属性、查找节点的方法

    DOM(Document Object Modle) 操作文档的编程接口DOM定义了表示和修改文档的方法,不能修改css样式表,在js中使用DOM方法改变元素的css样式,实质上是在元素上添加行间样式 ...

  4. 老潘 - ListView分析 - 学以致用篇(一)

    ListView分析学以致用篇(1) 在我们查看别人的博客的时候,一个人是一个风格的.先说下我的风格,我喜欢思想类比,然后介绍知识,不太喜欢填鸭式的灌输.如果只是想单纯的从我的博客中直接看到代码,我个 ...

  5. Quartz2D知识点聚合案例

    Quartz2D知识点聚合 基本 //画图片 UIImage *image = [UIImage imageNamed:@"阿狸头像"]; [image drawInRect:re ...

  6. Farseer.net轻量级开源框架 中级篇:SQL执行报告

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 下一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(M ...

  7. 迅为嵌入式开发板iTOP-6818开发板八核Cortex-A53架构,满足各种产品需求

    性价比更高 内存:1G(可选2G);存储:16G;4418:四核 Cortex-A9;6818:八核Cortex-A53. 功能更强 板载4G(全网通),GPS,WIFI,千兆以太网,重力加速度计等, ...

  8. jQuery PC端图片预览,鼠标移上去查看大图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. BASH BUILTIN COMMANDS 内建命令

    除非另外说明,这一章介绍的内建命令如果接受 - 引导的选项,那么它也接受 -- 作为参数,来指示选项的结束 : [arguments] 没有效果:这个命令除了扩展 arguments 并且作任何指定的 ...

  10. vue vueRouter vuex Axios webpack 前端常用内容

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.