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. easy ui combotree的操作

    1.获取combotree的选中值 $("#id").combotree("getValue"); 2.设置combotree的选中值 $('#id').com ...

  2. 关于jquery获取单选框value属性值为on的问题

    当取单选框的value值的时候,前提是要有value这个属性,如果没有value属性那么取出来的就会为on 取value值的常见三种方式为 $("input[name='XXX']:chec ...

  3. Glide清除缓存

    Glide是谷歌推荐的一款加载图片的第三方框架,对内存优化更好,更省资源,他的众多好处,我就不一一描述了,有兴趣的朋友可以百度一下,介绍的还是挺详细的. 今天主要给大家介绍一下关于怎么获取Glide的 ...

  4. fatal: Authentication failed for 问题解决

    执行以下code git config --system --unset credential.helper 参考地址: https://www.jianshu.com/p/8a7f257e07b8

  5. vscode增加xdebug扩展

    首先确保php增加了xdebug扩展,方法很多,可参考 https://www.cnblogs.com/wanghaokun/p/9084188.html.可通过phpinfo()查看是否已开启支持. ...

  6. jboss中JVM监控

    1)打开 http://server-name-or-ip/jmx-console/HtmlAdaptor2)在 jboss.system 节点找到 type=ServerInfo ,点击进入3)找到 ...

  7. zabbix3.0.4 部署之八 (zabbix3.0.4 报警前端配置)

    (如何让报警信息推送----微信.邮件)(邮件与微信一样就不在重复) 创建一个用户 将用户加入administrator组 添加之前设置的报警媒介脚本 设置报警等级 创建动作 配置报警内容 设置报警条 ...

  8. AIX 10G HA RAC卸载

    删除 1:crs_stat –t资源都停掉 2:停ha 3: 删除oracle 4:删除crs 5: 删除ha smit hacmp 6: 删除vg exportvg 7;卸载hacmp smitty

  9. fedora27安装ssh

    Fedora安装sshd 先确认是否已安装ssh服务: [root@localhost ~]# rpm -qa | grep openssh-server openssh-server-5.3p1-1 ...

  10. 配置个人Ip代理池

    做爬虫最害怕的两件事一个是被封账户一个是被封IP地址,IP地址可以使用代理来解决,网上有许多做IP代理的服务,他们提供大量的IP地址,不过这些地址不一定都是全部可用,因为这些IP地址可能被其他人做爬虫 ...