Description

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

Input

第一行包含三个正整数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)之间的墙的高度。
 
Solution
这是一道思维好题。不愧POI
发现,随着格子的水位逐渐上涨,一些本来分隔开的联通块连在了一起。
而且,墙越低,连在一起的时间就越早。
并且时间取决于最低的墙的高度。
 
神仙建模来了:
我们把每个格子看做一个点,墙看作点和点之间的边,高度就是边权。
对于每个联通块,维护当前联通块的水位,达到这个水位联通块本身的方案数,
向Kruskal那样,跑一个最小生成树,
联通合并的时候,更新水位,合并方案数即可。
ans[new]=(ans[x]+e[i].val-now[x])*(ans[y]+e[i].val-now[y])
就是,在没有达到高度e[i].val的时候,每个联通块还可以往上面升一升
正确性还是比较显然的。
因为按照val排序,联通块合并的时候,两边的联通块必然已经处理完毕,一定是最大的完整的联通块了。
而由于并查集,同一个联通块内部的边不会算重。
 
对了最后还要加上H-ans[fa]
 
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
const int N=+;
typedef long long ll;
int n,m,h;
ll ans[N];
int fa[N];
int now[N];
int fin(int x){
if(fa[x]==x) return x;
int ret=fin(fa[x]);
fa[x]=ret;ans[x]=ans[ret];now[x]=now[ret];
return ret;
}
int getnum(int x,int y){
return (x-)*m+y;
}
struct node{
int x,y;
int val;
bool friend operator <(node a,node b){
return a.val<b.val;
}
}e[*N];
int tot;
int main()
{
scanf("%d%d%d",&n,&m,&h);
for(int i=;i<=n;i++){
for(int j=;j<=m-;j++){
e[++tot].x=getnum(i,j);
e[tot].y=getnum(i,j+);
scanf("%d",&e[tot].val);
}
}
for(int i=;i<=n-;i++){
for(int j=;j<=m;j++){
e[++tot].x=getnum(i,j);
e[tot].y=getnum(i+,j);
scanf("%d",&e[tot].val);
}
}
sort(e+,e+tot+);
for(int i=;i<=n*m;i++){
fa[i]=i;ans[i]=;
now[i]=;
}
for(int i=;i<=tot;i++){
int x=fin(e[i].x);
int y=fin(e[i].y);
if(x!=y){
fa[x]=y;
ans[y]=(ans[x]+e[i].val-now[x])*(ans[y]+e[i].val-now[y])%mod;
now[y]=e[i].val;
}
}
int ff=fin();
ans[ff]=(ans[ff]+h-now[ff])%mod;
printf("%lld",ans[ff]);
return ;
}
 
这个题即使说是最小生成树,也没几个人会相信吧。
无从下手。
POI的奇妙之处就在此吧。
不用什么高深的算法,
不用什么奇技的代码,
就是考你的思维。
 
本题的关键点:水往上升,联通块合并,最矮的墙的高度决定联通块联通与否。
 
 
 

[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 : [POI2018]Powód

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

  4. BZOJ5101[POI2018]Powódź——并查集

    题目描述 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水 箱与外界之间有一堵高度无穷大的墙,因此水不可能漏到外面.已知水箱内每个格子的高度都是[ ...

  5. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  6. bzoj5100 [POI2018]Plan metra 构造

    5100: [POI2018]Plan metra Time Limit: 40 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 189  Sol ...

  7. [POI2018]Pionek

    [POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...

  8. bzoj千题计划249:bzoj5100: [POI2018]Plan metra

    http://www.lydsy.com/JudgeOnline/problem.php?id=5100 1.找到d1[i]+dn[i] 最小的点,作为1到n链上的点 2.令链长为D,若abs(d1[ ...

  9. 【BZOJ5102】[POI2018]Prawnicy 堆

    [BZOJ5102][POI2018]Prawnicy Description 定义一个区间(l,r)的长度为r-l,空区间的长度为0. 给定数轴上n个区间,请选择其中恰好k个区间,使得交集的长度最大 ...

随机推荐

  1. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  2. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  3. linux安装nginx并配置负载均衡

    linux上安装nginx比较简单: 前提是需要有gcc或者g++ 1.yum需要的依赖  yum -y install openssl openssl-devel 2.解压pcre库.zlib库   ...

  4. Percona XtraDB Cluster 5.7

    附加:相关在线文档https://www.percona.com/software/documentation 安装要求: 1.root权限2.保证开放3306.4444.4567.4568端口3.关 ...

  5. CS小分队第二阶段冲刺站立会议(6月3日)

    昨日成果:完成了主界面按钮移动交换位置 遇到问题:最后的时候发现仅交换了按钮在数据库中的信息,对于按钮的链接忘记交换了 今日计划:解决这个问题,对这个冲刺阶段的成果进行整理

  6. iOS应用程序内打开指定qq聊天、给某人打电话

    -(void)btn2Clik { UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSURL *url = [N ...

  7. StringBuffer 与 StringBuilder类的使用

    /*如果需要频繁修改字符串 的内容,建议使用字符串缓冲 类(StringBuffer). StringBuffer 其实就是一个存储字符 的容器. 笔试题目:使用Stringbuffer无 参的构造函 ...

  8. 凡事预则立|项目Beta冲刺准备

    1.讨论组长是否重选的议题和结论. 组员一致认为组长不需要重选,我们都很认可组长的表现,组长的付出我们都看在眼里,我们找不出更适合担任组长的人选. 2.下一阶段需要改进完善的功能. 财富值的布局优化以 ...

  9. b1

    组长:吴晓晖 过去两天完成了哪些任务: 代码重构进行中,界面,预计两个beta单位完成 展示GitHub当日代码/文档签入记录 接下来的计划 更加人性化的推荐算法 还剩下哪些任务 有哪些困难 有哪些收 ...

  10. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.18

    1.当天站立式会议照片 本次会议在5号公寓312召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:在上次会议内容完成的基础上增加新的任务. 2.每个人的工作 ...