求出Kruskal重构树,那么重构树上每个点的取值范围是定的。

考虑树形DP,则对于一个点,要么所有点水位相同,要么还未发生合并。

故$dp[x]=up[x]-down[x]+1+dp[l[x]]\times dp[r[x]]$。

时间复杂度$O(nm\log(nm))$。

#include<cstdio>
#include<algorithm>
const int N=1000010;
int n,m,H,ce,i,j,x,y,tot,f[N],son[N][2],l[N],r[N],dp[N];
struct E{int x,y,w;}e[N];
inline bool cmp(const E&a,const E&b){return a.w<b.w;}
inline int id(int x,int y){return (x-1)*m+y;}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int main(){
read(n),read(m),read(H);
for(i=1;i<=n;i++)for(j=1;j<m;j++){
e[++ce].x=id(i,j);
e[ce].y=id(i,j+1);
read(e[ce].w);
}
for(i=1;i<n;i++)for(j=1;j<=m;j++){
e[++ce].x=id(i,j);
e[ce].y=id(i+1,j);
read(e[ce].w);
}
std::sort(e+1,e+ce+1,cmp);
tot=n*m;
for(i=1;i<=tot;i++)f[i]=i;
for(i=1;i<=ce;i++){
x=F(e[i].x),y=F(e[i].y);
if(x!=y){
son[++tot][0]=x;
son[tot][1]=y;
f[x]=f[y]=f[tot]=tot;
r[x]=r[y]=e[i].w;
l[tot]=e[i].w+1;
}
}
r[tot]=H;
for(i=1;i<=tot;i++)dp[i]=(1LL*dp[son[i][0]]*dp[son[i][1]]+r[i]-l[i]+1)%1000000007;
return printf("%d",dp[tot]),0;
}

  

BZOJ5101 : [POI2018]Powód的更多相关文章

  1. [bzoj5101][POI2018]Powódź_并查集

    Powódź bzoj-5101 POI-2018 题目大意:在地面上有一个水箱,它的俯视图被划分成了$n$行$m$列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无穷大 ...

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

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

  3. 【BZOJ5101】[POI2018]Powód 并查集

    [BZOJ5101][POI2018]Powód Description 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水箱与外界之间有一堵高度无 ...

  4. [POI2018]Powódź

    Description 在地面上有一个水箱,它的俯视图被划分成了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. BZOJ5101 POI2018Powódź(并查集)

    如果某个格子的积水量超过了该格子的某个挡板高度,那么挡板另一端的积水量就会与其相同.看起来是一个不断合并的过程,考虑并查集.枚举深度,维护每个连通块内的方案数,深度超过某挡板高度时,将两端的连通块合并 ...

随机推荐

  1. String 类的实现(3)String类常用函数

      2 #include<iostream> 3 #include<stdio.h> 4 #include<assert.h> 5 #include <iom ...

  2. Python关键字及其用法

    Python有哪些关键字 -Python常用的关键字  and, del, from, not, while, as, elif, global, or, with, assert, else, if ...

  3. What is base..ctor(); in C#?

    I am disassembling some C# applications and I am trying to reconstruct the source code. I am disasse ...

  4. 【C++ Primer | 10】再探迭代器

    插入迭代器 1. 测试代码: #include<iostream> #include<vector> #include<list> #include<iter ...

  5. EntityFramework 优化建议(转)

    转载地址:http://blog.jd-in.com/947.html Entity Framework目前最新版本是6.1.3,当然Entity Framework 7 目前还是预览版,并不能投入正 ...

  6. Discuz3.2 新用户插入数据库SQL

    我们的网站要和Discuz整合到一起,有个新用户同步的需求,网络上很多的做法是用 UCenter的接口来做,反正最后都是插入SQL,笔者使用了直接操作数据库的方式,把操作的表和SQL整理了下,后面如果 ...

  7. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  8. Lock为线程上锁,防止数据混乱

    用法: 先实例化  lock = threading.Lock() 1. lock.acquire() 上锁 需上锁代码 lock.release() 解锁 2. with lock: 上下两种方式都 ...

  9. Tree Reconstruction Gym - 101911G(构造)

    ---恢复内容开始--- Monocarp has drawn a tree (an undirected connected acyclic graph) and then has given ea ...

  10. 6486: An Ordinary Game(规律)

    题目描述 There is a string s of length 3 or greater. No two neighboring characters in s are equal.Takaha ...