【APIO I】APIO2009 OIL采油区域 APIO2009 CONVENTION会议中心 APIO2009 ATM劫掠计划 APIO2010 特别行动队 APIO2010 PARTOL巡逻 Apio2010 SIGNALING 信号覆盖

【Q:为什么要用这么长的标题

A:为了骗访问……

 

浏览器突然奇葩了……我就不贴代码说说思路了……

 

采油区域:

我们可以根据三个采油区域在横向和纵向上的重叠情况分成六种分布:

(1)可以用两条横线分割

(2)可以用两条纵线分割

(3)可以分成左右两部分,其中左边可以分上下两部分

(4)……………………………,其中右边可以分上下两部分

(5)可以分成上下两部分,其中上面可以分成左右两部分

(6)………………………………,其中下面可以分成左右两部分

那然后经过一系列繁琐的预处理(其实DP就在预处理的时候写也是可以的)之后扫一扫就可以得到答案了、

 

会议中心:

如果不要求字典序最小的方案的话、显然直接贪心大家都懂的、

然后要求字典序最小的方案,就是要在不使答案变小的情况下尽量取编号小的、

可以有这样一种思路:

用ans(l,r)表示在时间l到时间r最多可以承办的会议数、

那么如果ans(1,begi)+1+ans(endi,T)=ans(1,T)的话第i个会议就是不影响总体的答案的对吧、

然后ans怎么求呢、、

可以用倍增的方法、、直接用时间求的话比较困难、于是我们可以反过来求2^j个活动需要多少时间、、

具体转移大家自行YY好了、、

然后对每个会议、找到包含它的区间、如果满足上式就把区间拆成(l,begi-1)和(endi+1,r)两个新的小区间、、

这个可以用线段树或者平衡树完成(c++可以用set)

 

劫掠计划:

这个题好似是这一年最水的题了、、直接tarjan缩完点一遍DP了事、

 

特别行动队:

朴素方程f[i]=max{f[j]+calc(i,j)}不解释、

然后拆calc的表达式可以发现是一个经典的斜率优化、、不展开了、

 

巡逻:

不难发现如果连接两个点的话可以使总的巡逻时间减小[两点间距离]-1、

那么一个树上距离最远的两个点的距离就是树的直径对把、、

两遍BFS求树的直径不用说了吧、、于是K=1就被秒掉了、

那么K=2怎么求呢、、注意如果我们两条路径都包含了一条边、、就等于没有包含过、、

于是我们在第一次求直径之后把直径上的边权全部取负再求直径就可以了、、

 

信号覆盖:

这个题我真的是完全想不到、、太令人发指了、、

按道理我是应该自己说一遍的、、但是、、就给大家发一个好一点的题解吧、、

Solution:http://blog.sina.com.cn/s/blog_9aa2786a01010u1p.html

 

posted @ 2013-04-22 09:13  JS_Shining  阅读(1919)  评论(0编辑  收藏  举报