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. Linux虚拟机安装教程

    必备组件: vmware(程序主题) 链接:https://pan.baidu.com/s/14OplOGOQTVAnf0iDqgDhDQ 提取码:jape centos(Linux系统) 链接:ht ...

  2. can总线实现stm32的IAP

    使用stm32f105rct6的can通信做IAP,实现固件的远程更新功能.IAP的实现包括两个程序:BootLoader和应用程序.启动过程先启动BootLoader,等待1s,若接收到烧写指令则开 ...

  3. 编写webpack 插件

    Webpack插件为第三方开发者释放了Webpack的最大可能性.利用多级回调开发者可以把他们自己的需要的功能引入到Webpack里面来.Build插件比Build loader 更进一步.因为你需要 ...

  4. 完整Highchart JS示例

    线性: $.ajax({ type:'post', url:appPages.urlListTjrll, cache:false, data:{year:year,month:month},// // ...

  5. Scrum立会报告+燃尽图(十二月五日总第三十六次):Final阶段分配任务

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  6. 20172319 《Java程序设计教程》 第9周学习总结

    20172319 2018.05.06-05.14 <Java程序设计教程>第9周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  7. linux 常用命令-编辑模式

    1.编辑模式就是通过vi或者vim打包文件,进入编辑模式,vim是vi的升级版,vim除了报错vi的命令外还包括一些额外的命令,本文以vim命令为例,如果需要查询而不需要编辑文件则可以通过cat命令查 ...

  8. 剑指offer:用两个栈实现队列

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 可以用stack1来存所有入队的数.在出队操作中,首先将stack1中的元素清空,转移到sta ...

  9. teamcity执行jmeter脚本使用Executable with parameters方式不能正确运行解决思路

    如下图是选择command Line:Executable with parameters设置启动jmeter.bat  命令如下 command Executable: D:\apache-jmet ...

  10. PHP时间格式化参数表笔记

    date_create_from_format() 函数返回一个根据指定格式进行格式化的新的 DateTime 对象.通常需要配合date_format()函数使用 语法: date_create_f ...