【Atcoder Grand Contest 011 F】Train Service Planning
题意:给\(n+1\)个站\(0,\dots,n\),连续的两站\(i-1\)和\(i\)之间有一个距离\(A_i\),其是单行(\(B_i=1\))或双行(\(B_i=2\)),单行线不能同时有两辆方向不相同的车在上面,现在每\(k\)分钟发一次车(从\(0\)到\(n\)和从\(n\)到\(0\)),需要安排\(k\)分钟内的时间表,使得从\(0\)开到\(n\)的时间和从\(n\)开到\(0\)的时间和最小。
思路:主席树优化\(dp\)。
这道题告诉我们要学好语文
首先避免在单行线上交叉的方式是在站台上停留一段时间。
假设我们从\(0\)到\(n\)的过程中停在第\(i\)个站台的时间是\(p_i\),从\(n\)到\(0\)的过程中停在第\(i\)个站台的时间是\(q_i\)。
那么我们看在第\(s\)个段中它们的时间区间是怎样的。
\(0\dots n\):\([\sum_{i=1}^{s-1} p_i+\sum_{i=1}^{s-1}A_i,\sum_{i=0}^{s-1}p_i+\sum_{i=1}^{s}A_i]\)
\(n\dots0\):\([\sum_{i=s}^{n}q_i+\sum_{i=s+1}^nA_i,\sum_{i=s}^nq_i+\sum_{i=s}^nA_i]\)
题目要求的就是这两个区间在\(mod\ k\)意义下不相交。
但是这样的式子比较丑,没办法化简,
所以我们换一种方式表示\(n\dots0\)的时间区间。
既然是模意义下的,我们就假设它在\(0\)出发,“倒退”回\(n\)。
那么它的时间区间就是\([-\sum_{i=0}^{s-1}q_i-\sum_{i=1}^sA_i,-\sum_{i=0}^{s-1}q_i-\sum_{i=1}^{s-1}A_i]\)。
我们要求这两个区间不相交,就是第一个区间的两个端点都不在第二个区间内。
移项得\(\sum_{i=0}^{s-1}p_i+q_i\leq-2\sum_{i=1}^sA_i\)
或者\(\sum_{i=0}^{s-1}p_i+q_i\geq-2\sum_{i=1}^{s-1}A_i\)。
即\(\sum_{i=0}^{s-1}p_i+q_i\)不在\((-2\sum_{i=1}^sA_i,-2\sum_{i=1}^{s-1}A_i)\)内
即\(\sum_{i=0}^{s-1}p_i+q_i\)在\([-2\sum_{i=1}^{s-1}A_i,-2\sum_{i=1}^sA_i]\)内。
那么题目转化成了这样的东西:
一个人在数轴上走路,起初在任一点,只能向右,
要求某些整数时间点时他的位置在模\(k\)意义下属于区间\([L_i,R_i]\),
问他最少走多少距离。
首先确定我们肯定只会走到端点上。
那么把所有端点离散化。
然后考虑一个很\(naive\)的\(dp\)。
设\(dp(i,j)\)表示现在在第\(i\)个段,
目前的位置\(mod\ k\)在第\(j\)个离散化后的端点处,走到第\(n\)段的最小代价。
那么转移的时候就从\(dp(i+1,*)\)转移来就好辣。
可惜这个方法只能过500分的点。
那我们换一种思路。
考虑\(dpL(i)\)和\(dpR(i)\)表示到了第\(i\)个段,
现在在\(L_i\)还是\(R_i\),走到第\(n\)段的最小代价。
转移以\(dpL\)为例。我们看现在如果一直不走最多到哪里会不可行,假设这个点为\(j\),
那么我们就从\(dpL(j)+L_j-L_i\)转移就好了。
但是求\(j\)的过程是\(O(n)\)的,肯定\(TLE\)。
那么就要看这个\(j\)的性质。然后发现并没有什么性质
所以我们用主席树维护每个新区间放下的时候每个点被覆盖了多少次。
但是主席树只能单点修改。所以果断差分。这样空间就得开的很大很大(我开了1e7。。。
如果在\(i\dots j\)的这段区间内所有新区间都覆盖\(L_i\),那么自然是极好的。
直接二分\(j\)即可。复杂度\(O(n log(n)^2)\)。
再看怎么求答案。
首先我们还是从一个\(L_i\)(或\(R_i\))开始,一直走走走到\(i\),再加上\(dpL(i)\)即可。只是需要判断是否中间不能走了。
主席树真\(^{tm}\)难写。中间还出现了一些幺蛾子。。。
人生第一棵主席树祭
yutaka1999:
首先转化题意。
那么考虑\(dp(i)\)表示现在在\(L_i\),一直往后走的最小代价。
转移的时候果断找现在一直可以留住不动的最大位置,即不包含它的最小位置。
线段树就可以解决这个问题。只要你不用记忆化搜索,从后往前扫描就可以做了。
只是需要一个区间取\(min\),单点查询。
我这个\(^{sb}\)竟然写了个主席树。。。
kyuridenamida:
这位思路和yutaka一样,但是不知道好懂到哪里去了。。。
这就是神仙的高冷和接地气的区别???
lhicpetuh:
从前往后\(dp\),那么线段树还是需要区间修改。
这位直接写了个区间查询,目的就是找不包含某个点中最小的\(dp\)值。
Petr:
好像、似乎、也许、就是用\(set\)代替了线段树???
单点修改,区间查询?
利用了\(Java\)的\(Headset\)、\(Tailset\)的功能,
找到在区间内的最小最大值。
然后把它们删掉,用新的替换。
简直\(^{BT}\)。
-XraY-:
也是\(set\)代替线段树?
首先\(set\)里面存的就是一个\(pair(i,j)\),代表从第\(i\)开始的最小\(dp\)值是\(j\)
那么我们在区间修改的时候就是把中间的所有不同的\(dp\)值干掉,
再加入\(l,v\)和\(r,*\)即可。
DEGwer:
和-XraY-差不多。
【Atcoder Grand Contest 011 F】Train Service Planning的更多相关文章
- AtCoder Grand Contest 011 F - Train Service Planning
题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...
- 【AtCoder Regular Contest 082 F】Sandglass
[链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...
- 【AtCoder Regular Contest 076 F】Exhausted (贪心)
Description 机房里有M台电脑排成一排,第i台电脑的坐标是正整数i. 现在有N个OIer进入了机房,每个OIer需要一台电脑来学tui习ji,同时每个OIer对自己电脑所处的坐标范围有一个要 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- 【agc019f】AtCoder Grand Contest 019 F - Yes or No
题意 有n个问题答案为YES,m个问题答案为NO. 你只知道剩下的问题的答案分布情况. 问回答完N+M个问题,最优策略下的期望正确数. 解法 首先确定最优策略, 对于\(n<m\)的情况,肯定回 ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- 【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]
Wide Swap Time Limit: 50 Sec Memory Limit: 512 MB Description Input Output Sample Input 8 3 4 5 7 8 ...
- 【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]
Tautonym Puzzle Time Limit: 50 Sec Memory Limit: 256 MB Description 定义一个序列贡献为1,当且仅当这个序列 由两个相同的串拼接而成 ...
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
随机推荐
- RabbitMQ消息队列(三)-Centos7下安装RabbitMQ3.6.1
如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...
- NFS的安装
NFS的安装鸟哥地址:http://vbird.dic.ksu.edu.tw/linux_server/0330nfs_2.php 13.2 NFS Server 端的设定 既然要使用 NFS 的话, ...
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
- python迭代和解析(3):range、map、zip、filter和reduce函数
解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html range range()是一个内置函数,它返回一个数字序列,功能和Li ...
- 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...
- My操作小技巧
1.当我们新增一条数据之后想要获取其自增长的id,可以紧随新增语句后调用 SELECT last_insert_id();即可获得,一般搭配变量一起使用 SELECT @newUserId:=last ...
- C#调用Windows(8/10)自带的虚拟键盘
以下是调用代码: private const Int32 WM_SYSCOMMAND = 274; private const UInt32 SC_CLOSE = 61536; [DllImport( ...
- 2018年终总结之AI领域开源框架汇总
2018年终总结之AI领域开源框架汇总 [稍显活跃的第一季度] 2018.3.04——OpenAI公布 “后见之明经验复现(Hindsight Experience Reply, HER)”的开源算法 ...
- linux下的qt串口通信
1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...
- 预置第三方apk到MTK项目相关问题总结
目前5.0之后项目预置方式通用步骤为: 建立apk文件夹; 置目标apk到该文件夹下; 解压缩apk查看是否包含lib/文件夹(apk项目是否包含lib库文件); 在该文件夹下编写Androi ...