问题描述
  有一个正方形的地区,该地区特点鲜明:如果把它等分为N×N个小正方形格子的话,在每个格子内的任意地点的地表高度是相同的,并且是一个0到M之间的整数。正方形地区的外部被无限高的边界包围。
  该地区可能会有积水。经过多年的观察,人们发现了几个关于积水的重要规律:
  1. 每个格子要么完全没有积水,要么它内部的任意地点的水面高度都是相同的。并且水面高度一定大于地表高度。
  2. 每个格子的水面高度在0~M之间,并且一定是整数。
  3. 对于相邻(必须为边相邻)的两个格子,一定不会出现水自动从一个格子流向另一个格子的情况。也就是说,一定不能出现这两个格子都有水且水面高度不同,或者有水格子的水面比无水格子的地表要高的情况。
  例如,下面图中每个格子里有两个数a/b,说明该格子的地表高度是a,水面高度是b(均为海拔高度),而没有水的格子中b以“−”表示。则左边的情况是符合规律的,而右边的情况并不符合以上规律,因为水可以由2/4的格子流向3/−的格子。

  (图1)

  该地区水文站的工作人员小A想知道,该地区中有多少种不同的水位情况符合规律。你能回答他的这个问题吗?
输入格式
  输入文件的第一行包含两个正整数N和M。
  随后的N行,每行包含N个非负整数。其中第i+1行的第j个数表示该地区第i行第j列格子的地表高度。
输出格式
  输出文件只包含一个整数,即该地区符合规律的水位情况种数。
样例输入
4 3
1 1 1 1
1 2 2 2
1 2 3 3
1 2 3 2
样例输出
6
对样例的说明
  符合规律的水位情况有以下六种 :


数据规模和约定

 
 
好一个并查集
首先我们正着想,一开始都有模模糊糊的这个想法,就是划分区域,这几个区域的水一旦高于分界线的高度就会汇合,所以先计算出水位低于分界线的方案数,再算高于分界线的方案数
显然,低于这个高度的方案数是这几个区域的方案数的乘积,高于这个高度的方案数就是最高限制-这个高度,这几个区域的方案数可以递归做
但是递归又难写,时间上也不允许
所以我们从小到大枚举分界线的高度,把这个格子四周的区域合并,一直到整个区域,用并查集维护区域的信息
WA了好多次,原因是高精度数空间没开够,囧......
 const
maxn=;
s=;
fx:array[..]of longint=(,,-,);
fy:array[..]of longint=(,,,-);
type
point=record
x,y:longint;
end;
big=array[..]of int64;
var
a:array[..maxn,..maxn]of longint;
b:array[..maxn*maxn]of point;
f,h:array[..maxn*maxn]of longint;
ans:array[..maxn*maxn]of big;
n,m:longint; operator *(var a,b:big)c:big;
var
i,j:longint;
begin
fillchar(c,sizeof(c),);
for i:= to a[] do
for j:= to b[] do
inc(c[i+j-],a[i]*b[j]);
c[]:=a[]+b[]-;
for i:= to c[]- do
begin
inc(c[i+],c[i]div s);
c[i]:=c[i]mod s;
end;
while c[c[]]>=s do
begin
c[c[]+]:=c[c[]]div s;
c[c[]]:=c[c[]]mod s;
inc(c[]);
end;
end; procedure add(var a:big;b:longint);
var
i:longint;
begin
inc(a[],b);
i:=;
while a[i]>=s do
begin
inc(a[i+],a[i]div s);
a[i]:=a[i]mod s;
inc(i);
end;
if i>a[] then a[]:=i;
end; function calc(i,j:longint):longint;
begin
exit((i-)*n+j);
end; function find(x:longint):longint;
begin
if f[x]=x then exit(x);
f[x]:=find(f[x]);
exit(f[x]);
end; procedure swap(var x,y:point);
var
t:point;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j,y:longint;
begin
i:=l;
j:=r;
y:=a[b[(l+r)>>].x,b[(l+r)>>].y];
repeat
while a[b[i].x,b[i].y]<y do
inc(i);
while a[b[j].x,b[j].y]>y do
dec(j);
if i<=j then
begin
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure print(a:big);
var
i:longint;
k:int64;
begin
write(a[a[]]);
for i:=a[]- downto do
begin
k:=s div ;
while k> do
begin
if a[i]<k then write()
else break;
k:=k div ;
end;
write(a[i]);
end;
end; procedure main;
var
i,j,x,y:longint;
begin
read(n,m);
for i:= to n do
for j:= to n do
begin
read(a[i,j]);
h[calc(i,j)]:=a[i,j];
b[calc(i,j)].x:=i;
b[calc(i,j)].y:=j;
end;
sort(,n*n);
for i:= to n*n do
begin
f[i]:=i;
ans[i][]:=;
ans[i][]:=;
end;
for i:= to n*n do
for j:= to do
if (b[i].x+fx[j]>) and (b[i].x+fx[j]<=n) and (b[i].y+fy[j]>) and (b[i].y+fy[j]<=n) then
begin
x:=find(calc(b[i].x,b[i].y));
y:=find(calc(b[i].x+fx[j],b[i].y+fy[j]));
if (h[x]>=h[y]) and (x<>y) then
begin
add(ans[y],h[x]-h[y]);
ans[x]:=ans[x]*ans[y];
f[y]:=x;
end;
end;
add(ans[find()],m-a[b[n*n].x,b[n*n].y]);
print(ans[find()]);
end; begin
main;
end.

清橙A1363. 水位 - 清华大学2012年信息学优秀高中学子夏令营的更多相关文章

  1. 【洛谷1340】兽径管理(最小生成树 Kruskal)(sort的一些技巧)【2012福建省信息学奥林匹克CCF NOIP夏令营第05天训练】

    Description 约翰农场的牛群希望能够在 N 个(1<=N<=6000) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任 ...

  2. 【刷题】清橙 A1295 necklace

    试题来源 清华大学2011年百名信息学优秀高中学子夏令营 问题描述 有人打算送给你一条宝石项链,包含了N颗五颜六色(一共有M种颜色)的宝石.因为本问题中你只关心每个宝石的颜色,而且项链现在两头还没有接 ...

  3. 清橙A1212:剪枝

    题面 清橙 Sol 一种新的树上\(DP\)姿势 从左往右按链\(DP\) 做法: 维护两个栈\(S1\),\(S2\) \(S1\)存当前的链 \(S2\)存分叉点以下要改的链 \(Dfs\),弄一 ...

  4. 清橙A1202&Bzoj2201:彩色圆环

    因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了 win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个 ...

  5. [清橙A1210]光棱坦克

    [清橙A1210]光棱坦克 题目大意: 平面上放置了\(n(n\le7000)\)个反射装置,光纤将从某个装置出发,在经过一处装置时发生反射,若经过的装置坐标依次为\((x_1,y_1),(x_2,y ...

  6. 清橙A1206.小Z的袜子 && CF 86D(莫队两题)

    清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...

  7. 洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)

    试题来源 2011中国国家集训队命题答辩 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  8. 【刷题】清橙 A1339 JZPLCM(顾昱洲)

    试题来源 2012中国国家集训队命题答辩 问题描述 给定一长度为n的正整数序列a,有q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案模1000000007. 输入 ...

  9. 清橙 A1206 小Z的袜子(莫队算法)

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:1357   AC次数:406   平均分:46.75   将本题分享到:        查看未格式化的试题 ...

随机推荐

  1. DynamicObject数据包操作

    DynamicObject的结构非常简单明了,就是一个字典,类似于一个Dictionary<string, object>,其中的object可能是一个简单值(普通字段),可能是一个复杂值 ...

  2. ubuntu安装python3

    系统本身就已经安装了python2.7 和python3.4 现在需要做的就是将默认的版本更换一下下就可以了. 检查python的版本 python -V 老的版本没必要去产出了,因为会有一些程序依赖 ...

  3. 【学习笔记】【C语言】注释

    1. 什么是注释 1) 注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解.解释的意思 2) 注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流.假如我写完一行代 ...

  4. AMQ学习笔记 - 15. 实践方案:基于ActiveMQ的统一日志服务

    概述 以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务. 参考:Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析 与参考文章的比较 ...

  5. 【风马一族_Java】9*9口诀

    public class arithmetic { public static void main(String[] args){ sows(9,9); } private static void s ...

  6. ubuntu 停在开机界面

    今天有解决了一个问题.我在win7虚拟机上装的64位的Ubuntu 12.04.忘了怎么个情况了,反正就是系统进不去了,停在了开机界面,5个点的那个. 解决方法如下: 开机的时候按住shift键,进入 ...

  7. 解决Discuz“完善用户资料”任务不能完成的问题

    最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没 ...

  8. 一个统计目录文件大小的php函数

    早上刚到公司,头告诉我,抓紧写一个小函数,用来统计指定目录中文件大小,我了个去,动手吧,还好有点小基础,一会就完工了,哈哈.代码在下面咯. <? /** 统计目录文件大小的函数 @author  ...

  9. php 获取数组第一个值的方法分享

    以下是对使用php实现获取数组第一个值的方法进行了详细的分析介绍,需要的朋友可以过来参考下 reset (PHP 3, PHP 4, PHP 5)reset -- 将数组的内部指针指向第一个单元 说明 ...

  10. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程

    这篇文章主要介绍了Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程,需要的朋友可以参考下 准备篇 一.环境说明: 操作系统:Windows Server 201 ...