cogs2550. 冰桥,升起来了!
【问题背景】
11月16日:
今天要来到南极洲的一角来考察啦!南极的空气真的很好呢,只不过有点冷,雪什么的真是太可爱了!
这次我要在一个冰谷(应该说是山谷的地方)考察,考察点在这山谷的两边(希望不要掉下去!),可是我只能坐着直升机到达这些考察点中的一个(因为空中的气流少有平稳的时候),剩下的地方只能靠腿走过去了。不过我可以预定直升机在气流合适的时候到某个考察点来接我,真是方便呀!
哦!不过我还有很多设备。。。我可搬不动,不过放在滑溜溜的冰面上拉着还是可以的,我有一个吸热扩散器,可以在一些地形合适的地方建一座冰桥!看来我只能沿着冰桥走了。
QAQ我刚看了地图,似乎冰桥只能建立在跨越山谷的两个考察点间,而且不能交叉,而且最可恶的是,这些冰桥我只能走一次。。。。因为他们太脆弱了。。真糟糕,看来这次可能不能把全部的考察点都考察了。。不过我要让这次考察最有价值!
那就从分析考察点的价值开始吧,然后要好好想想怎么安排这次考察的顺序。
——美
【问题描述】
山谷两侧分别有一些考察点,每个考察点都有其价值,其中一些考察点间可以建立跨越山谷的冰桥,让小美能够从一个考察点到另一个考察点。
但是冰桥有它的缺点,它十分的脆弱,以至于只能走一次,而且不能交叉(假设两座冰桥分别连接了 a1 和 b1, a2 和 b2 ,当 a1 < a2 且 b1 > b2时两桥交叉)。
由于小美带着很多沉重的设备,所以她必须沿着冰桥走,请设计策略使得小美这次的考察的价值和最大。
【输入格式】
输入共 A+B+K+1 行。
第 1 行包含 3 个由空格隔开的非负的整数 A, B, K,表示山谷 A, B 两侧各有 A, B 个考察点,其中可以建立 K 座冰桥。
第 1 +(1) 至 1 +(A) 行,每行包含 1 个正整数,其中第 1 +(i) 行的正整数 p 表示 A 侧第 i 个考察点的价值为 p。
第 1+A +(1) 至 1+A +(B) 行,每行包含 1 个正整数,其中第 1+A +(i) 行的正整数 p 表示 B 侧第 i 个考察点的价值为 p。
第 1+A+B +(1) 至 1+A+B +(K) 行,每行包含 2 个正整数 u, v,表示 A 侧的第 u 个考察点与 B 侧的第 v 个考察点间可以建立冰桥。
【输出格式】
输出共 1 行。
第 1 行包含 1 个正整数,表示此次考察的最大价值和。
【样例输入】
3 2 4
2
2
3
1
2
3 2
2 1
1 2
3 1
【样例输出】
8
【数据规模与约定】
对于测试点 1 到 2,A <= 5; B <= 5
对于测试点 3,A <= 200; B <= 200; K <= 15,000
对于测试点 4 到 10,A <= 40,000; B <= 40,000; K <= 100,000
对于全部数据,保证 p <= 40,000; 保证冰桥没有重复
官方题解:
定义状态 FA[i], FB[i] 分别表示到达 A, B 侧的第 i 个点所能得到的最大价值和。
首先我们可以得知,冰桥不交叉的充分必要条件是同一侧被访问的点的编号递增。
对所有的边进行从小到大排序,按照排序后边的顺序进行转移。
排序后可以保证,对于每个点 u,其出边到达的点的编号在排序后是递增的,所以对于连接 a 和 b 的边,此时的 FA[a] 只会从小于 b 的点中转移而来,FB[b] 也只会从比 a 小的点转移过来,所以这时的 FA[a] 尝试从 FB[b] 转移是绝对合法的, FA[a] = max(FA[a], FB[b] + VA[a]) (保留先前最大值 或者 从B侧b点走到A侧a点)
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 101000
using namespace std;
struct edge{
int from,to;
void read(){
scanf("%d%d",&from,&to);
}
}a[MAXN];
int dp1[MAXN],dp2[MAXN],v1[MAXN],v2[MAXN];
int A,B,K; bool cmp(edge x,edge y){
if(x.from==y.from) return x.to<y.to;
return x.from<y.from;
} int main()
{
scanf("%d%d%d",&A,&B,&K);
for(int i=;i<=A;i++) scanf("%d",&v1[i]);
for(int i=;i<=B;i++) scanf("%d",&v2[i]);
for(int i=;i<=K;i++) a[i].read();
sort(a+,a+K+,cmp);
for(int i=;i<=A;i++) dp1[i]=v1[i];
for(int i=;i<=B;i++) dp2[i]=v2[i];
for(int i=;i<=K;i++){
int from=a[i].from,to=a[i].to,d1=dp1[from],d2=dp2[to];
dp1[from]=max(dp1[from],d2+v1[from]);
dp2[to]=max(dp2[to],d1+v2[to]);
}
int ans=;
for(int i=;i<=A;i++) ans=max(ans,dp1[i]);
for(int i=;i<=B;i++) ans=max(ans,dp2[i]);
printf("%d",ans);
return ;
}
cogs2550. 冰桥,升起来了!的更多相关文章
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权
iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...
- hub,桥,交换机,路由器的区别
1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...
- 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评
最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...
- 在 MAC OS X 安装 ADB (Android调试桥)
什么是 ADB? Android调试桥( adb )是一个开发工具,帮助安卓设备和个人计算机之间的通信. 这种通信大多是在USB电缆下进行,但是也支持Wi-Fi连接. adb 还可被用来与电脑上运行的 ...
- java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)
在JVM虚拟机中泛型编译的时候,会出现类型擦除.但是,在多态场景中,编译时,擦除方式会出现多态被破坏的可能. 举个栗子: A.java public class A<T> { void g ...
- hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)
/* 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! tm太坑了... 1,如果这个无向图开始就是一个非连通图,直接输出0 2,重边(两个节点存在多条边, 权值不一样) 3,如果找到 ...
- Socket桥(转载)
最好方案:使用haproxy 或者nginx转发.自己写程序性能和监控难保证,推荐使用开源软件替代. 源地址为:http://baishaobin2003.blog.163.com/blog/stat ...
- 割点和桥---Tarjan算法
使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况: (1)该节点是根节点,且有两棵以上的子树; (2)该节 ...
随机推荐
- 【Offer】[57-1] 【和为S的两个数字】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 牛客网刷题 ...
- Day004作业
1,写代码,有如下列列表,按照要求实现每⼀一个功能li = ["alex", "WuSir", "ritian", "barry& ...
- MySQL基础/数据库和表的设计
MySQL基础 一:安装MySQL(按步骤操作,如果下载后使用不了,试着用360安全卫士卸载MySQL,清除残留的,方便在下载造成不必要的麻烦:如果这样也不行,那就需要重做系统在进行下载) 二:创建数 ...
- ACM团队招新赛题解
标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...
- 使用dbutils
环境准备: 包结构: mysql导出sql脚本: //product CREATE TABLE `product` ( `id` int(10) NOT NULL AUTO_INCREMENT, `n ...
- Android静态注册广播无法接收的问题(8.0+版本)
如果你静态注册的广播无法接收到消息,请先检查下:你的安卓版本是不是8.0+ * 前言** Google官方声明:Beginning with Android 8.0 (API level 26), t ...
- 【python】requests模块初探(一)
一.写在前面 Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完 ...
- mysql创建表时字段类型选择与优化
一.选择原则 1.应该尽量使用可以正确存储数据的最小字段类型 2.选用简单的数据类型,例如:一个是尽量用mysql内置的字段类型来存储日期和时间:另一个存储IP地址尽量用整型:能用整型的尽量不用字符串 ...
- SVN更改地址
因为服务器更改或其他某些原因导致svn地址改变,那么本地应该如何操作tortoiseSVN?如何成功的把项目进行迁移? 操作步骤 1.右击项目目录---TortoiseSVN----重新定位(英文版是 ...
- MySQL命令窗口出现中文乱码的解决方法
查询表语句的时候,出现了中文乱码,但是用Navicat for MySQL查看的时候却是正常的,字符集都是设置的utf-8,如下图所示: 其实上大学学习java的时候也遇到了中文乱码但是却没有 ...