2007: [Noi2010]海拔 - BZOJ
Description
YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路。 小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,YT市市民认为爬坡是一件非常累的事情,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。因此如果一段道路的终点海拔减去起点海拔的值为h(注意h可能是负数),那么一个人经过这段路所消耗的体力是max{0, h}(这里max{a, b}表示取a, b两个值中的较大值)。 小Z还测量得到这个城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知。小Z想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡所消耗的总体力和的最小值。
Input
第一行包含一个整数n,含义如上文所示。 接下来4n(n + 1)行,每行包含一个非负整数分别表示每一条道路每一个方向的人流量信息。输入顺序:n(n + 1)个数表示所有从西到东方向的人流量,然后n(n + 1)个数表示所有从北到南方向的人流量,n(n + 1)个数表示所有从东到西方向的人流量,最后是n(n + 1)个数表示所有从南到北方向的人流量。对于每一个方向,输入顺序按照起点由北向南,若南北方向相同时由西到东的顺序给出(参见样例输入)。
Output
仅包含一个数,表示在最理想情况下每天上班高峰期间所有人爬坡所消耗的总体力和(即总体力和的最小值),结果四舍五入到整数。
Sample Input
1
1
2
3
4
5
6
7
8
Sample Output
3
【样例说明】
样例数据见下图。
最理想情况下所有点的海拔如上图所示。
【数据规模】
对于20%的数据:n ≤ 3;
对于50%的数据:n ≤ 15;
对于80%的数据:n ≤ 40;
对于100%的数据:1 ≤ n ≤ 500,0 ≤ 流量 ≤ 1,000,000且所有流量均为整数。
一不小心就看到了是最小割233,然后就想到了最小割构图
因为左上角是0右下角是1,所以我们海拔肯定是0或者1,于是最小割就很明显了,就是他给你的这张图,左上角为源右下角为汇
数据太大所以我们又只能换成对偶图最短路了,可以参考bzoj1001狼与兔子,不过那是无向图,这个是有向图
于是右→下,下→左,左→上,上→右(还成环了233),跑一遍右上到左下的最短路就行了,直接SPFA有两个点过不去,所以我加了heap
const
maxn=;
inf=;
var
first:array[..maxn*maxn]of longint;
next,last,w:array[..maxn*maxn*]of longint;
n,tot:longint; function calc(x,y:longint):longint;
begin
if (x=) or (y=n+) then exit();
if (x=n+) or (y=) then exit(n*n+);
exit((x-)*n+y);
end; procedure insert(x,y:longint);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; var
q,h,dis:array[..maxn*maxn]of longint;
flag:array[..maxn*maxn]of boolean;
r:longint; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure up(x:longint);
var
i:longint;
begin
while x> do
begin
i:=x>>;
if dis[q[x]]<dis[q[i]] then
begin
swap(q[x],q[i]);
h[q[x]]:=x;h[q[i]]:=i;
x:=i;
end
else exit;
end;
end; procedure down(x:longint);
var
i:longint;
begin
i:=x<<;
while i<=r do
begin
if (i<r) and (dis[q[i+]]<dis[q[i]]) then inc(i);
if dis[q[i]]<dis[q[x]] then
begin
swap(q[i],q[x]);
h[q[x]]:=x;h[q[i]]:=i;
x:=i;i:=x<<;
end
else exit;
end;
end; procedure delete;
begin
swap(q[],q[r]);
h[q[]]:=;
dec(r);
down();
end; procedure spfa;
var
i:longint;
begin
r:=;q[]:=;flag[]:=true;h[]:=;
for i:= to n*n+ do dis[i]:=inf;
while r> do
begin
if q[]=n*n+ then break;
i:=first[q[]];
while i<> do
begin
if dis[q[]]+w[i]<dis[last[i]] then
begin
if not flag[last[i]] then
begin
inc(r);q[r]:=last[i];h[last[i]]:=r;
flag[last[i]]:=true;
end;
dis[last[i]]:=dis[q[]]+w[i];up(h[last[i]]);
end;
i:=next[i];
end;
flag[q[]]:=false;delete;
end;
end; procedure main;
var
i,j:longint;
begin
read(n);
for i:= to *n*(n+) do read(w[i]);
for i:= to n do
for j:= to n do
insert(calc(i,j),calc(i+,j));
for i:= to n do
for j:= to n do
insert(calc(i,j+),calc(i,j));
for i:= to n do
for j:= to n do
insert(calc(i+,j),calc(i,j));
for i:= to n do
for j:= to n do
insert(calc(i,j),calc(i,j+));
spfa;
writeln(dis[n*n+]);
end; begin
main;
end.
2007: [Noi2010]海拔 - BZOJ的更多相关文章
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
- 2007: [Noi2010]海拔
2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...
- bzoj 2007 [Noi2010]海拔——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...
- 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)
题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...
- bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...
- NOI2010海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1302 Solved: 612[Submit][Status] ...
随机推荐
- x64、x86_64、x64三者的区别
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA ...
- 另类安装系统——PE工具提取
1. 在当前系统使用安装工具win$man打开,即pe里集成安装工具 2. 选择安装的磁盘或者分区和引导分区 3. 可以默认下一步 4. 不想更改盘符可以默认下一步 5. 最后完成开始安装部署(还需要 ...
- 关于柯尼卡美能达bizhub250出现c2557错误解决方法
打印机出现c2557代码的操作方法 1. 按效用/计数器键 英文是(Utility/Counter) 2. 看到有检查细息(Check Detail) 3. ...
- C# lock用法
当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源 ...
- Repost: Set Delivery Block on SO
If SO is incomplete, then automatically set the delivery block on the SO header. as suggested by ear ...
- AndroidStudio支持新的NDK的操作使用
在2015的Google I / O大会,5月底,谷歌宣布了一项新的支持由Android NDK Studio 1.3,Jetbrains CLion集成功能,Android gradle插件.这种支 ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- Redis源码研究--启动过程
---------------------6月23日--------------------------- Redis启动入口即main函数在redis.c文件,伪代码如下: int main(int ...
- Zencart 国家排序及中文名称的扩展
最终实现效果如上 具体步骤: 1. 手动或SQL修改数据表,增加2个字段 ) ) '; 2. 修改admin/countries.php文件,增加表单插入编辑功能, 共计7处,此处忽略具体代码. 3. ...
- 一个JS的日期格式化算法示例
一个JS的日期格式化算法. 例子: <script> /** * Js日期格式化算法实例 * by www.jbxue.com */ function dateFormat(date, f ...