第四届蓝桥杯决赛 A组 供水设施 dp+拓扑+枚举
来源:互联网 发布:arch linux 安装教程 编辑:程序博客网 时间:2024/04/30 18:46
标题:供水设施
X星球的居民点很多。Pear决定修建一个浩大的水利工程,以解决他管辖的N个居民点的供水问题。现在一共有N个水塔,同时也有N个居民点,居民点在北侧从1号到N号自西向东排成一排;水塔在南侧也从1号到N号自西向东排成一排。
N条单向输水线(有水泵动力),将水从南侧的水塔引到北侧对应的居民点。我们不妨将居民点和水塔都看做平面上的点,居民点坐标为(1,K)~(N,K),水塔为(1,0)~(N,0)。除了N条纵向输水线以外,还有M条单向的横向输水线,连接(Xi,Yi)和(Xi,(Yi)+1)或者(Xi,Yi)和(Xi,(Yi)-1)。前者被称为向右的水路,而后者是向左的。不会有两条水路重叠,即便它们方向不同。布局的示意图如:上图所示。显然,每个水塔的水都可以到达若干个居民点(而不仅仅是对应的那个)。例如上图中,4号水塔可以到达3、4、5、6四个居民点。现在Pear决定在此基础上,再修建一条横向单项输水线。为了方便考虑,Pear认为这条水路应当是自左向右的,也就是连接了一个点和它右侧的点(例如上图中连接5和6两个纵线的横向水路)。Pear的目标是,修建了这条水路之后,能有尽可能多对水塔和居民点之间能到达。换句话说,设修建之后第i个水塔能到达Ai个点,你要最大化A1+A2+...+An。根据定义,这条路必须和X轴平行,但Y坐标不一定要是整数。注意:虽然输入中没有重叠的水路,但是你的方案可以将新修的输水线路与已有的水路重叠。
【输入数据】
输入第一行包含三个正整数N,M,K,含义如题面所述:N是纵向线数,M横向线数,K是居民点纵坐标。
接下来M行,每行三个整数。前两个正整数Xi Yi表示水路的起点坐标;1<=Xi<=N,0<Yi<K。接下来一个数0或者1,如果是0表示这条水路向左,否则向右。保证水路都是合法的,也就是不会流向没有定义的地方。
【输出数据】
输出一行。是一个正整数,即:题目中要求的最大化的A1+A2+…+An。
【输入样例1】
4 3 2
1 1 1
3 1 0
3 1 1
【输出样例1】
11
【输入样例2】
7 9 4
2 3 0
7 2 0
6 3 1
6 1 0
2 1 1
3 3 1
5 2 0
2 2 1
7 1 0
【输出样例2】
21
题目难度在于数据规模。 首先不难发现:修建水渠的肯定是 y 坐标整点。因此对于 20%的数据,暴力枚举哪一 个位置修建水渠即可。接下来我们需要观察出,这是一个平面图,因而每个点能到达的居 民点一定是连续的一段(因为有南北向水渠所以这一点比较显然)。接下来,如果把 N 个水塔能到达的居民点区间都求出来,则区间是单调不降的。这同样取决于平面图的性质。 由于没有(双向)重边,所以图肯定是一个拓扑图。要想得到每个水塔能到达哪些居 民点,只要把拓扑图构出来,并按拓扑序进行 dp(得到每个点能到达的最左最右点即可)。 接下来枚举那条添加的边。这条边肯定是加在某个“关键点”向右的——所谓关键点就是 所有居民点、路的端点、水塔。枚举它一共有 O(M+N)种情况。这条路必然把原来的一个点 向右的距离扩展了一段。接下来,假设这个点能由[l,r]这一段居民点到达(这里易知也 是连续的,可以在反图上 dp 求出),那么就相当于这些区间的右端点都和某个数取 max。 因为右端点有序,所以很容易维护。其它之前提到的操作都可以用 stl 解决。 整个算法复杂度为 O(NlogN)。用 O(N^2)等较劣的算法直接实现可得 60 分或 40 分。
然而没有代码。
- 第四届蓝桥杯决赛 A组 供水设施 dp+拓扑+枚举
- 穿越雷区第六届蓝桥杯大赛个人赛决赛(C语言A组)第四题
- 第六届蓝桥杯决赛 C语言A组 题解 第四题_穿越雷区
- 2015蓝桥杯决赛Java A组 第四题--穿越雷区
- 第三届蓝桥杯Java高职组决赛第四题
- 第四届蓝桥杯C++本科B组决赛解题报告
- 第七届蓝桥杯决赛JavaB组第四题 路径之谜
- 第七届蓝桥杯决赛JavaA组第四题_机器人塔
- 2014年第五届蓝桥杯决赛C组题目 第四题 标题:拼接平方数
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 猜灯谜(结果填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 连续奇数和(结果填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 空白格式化(代码填空)
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 高僧斗法(编程大题)
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 农场阳光(编程大题)
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛
- 蓝桥杯 穿越雷区 2015年第六届蓝桥杯JavaB组决赛第四题
- 2013年第四届蓝桥杯C/C++ C组决赛真题题解
- 【2013年第四届蓝桥杯C/C++程序设计本科B组决赛 连续奇数和(结果填空) 】
- iOS开发:关于layout的一些方法
- 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 等一系列问题
- 博弈整理(取物)
- 圈里圈外 | 考什么英语四六级,明明情商二级还没过……
- Leetcode-13. Roman to Integer
- 第四届蓝桥杯决赛 A组 供水设施 dp+拓扑+枚举
- redis Uncaught exception RedisException: Redis server went away
- Kylin-百度地图的实践
- ant自动打包apk(详细),引用到第三方工程类库以及里面的资源,修改包名和工程名
- 移动政企笔试+一面(群面)+3-5分钟单面
- [Java 并发]Java多线程同步优化(三)
- QML中正则式的应用
- EventBus 3.0的用法详解(一)
- 怎样在android各级打印backtrace