洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
神仙思维题还是要写点东西才好。
建立数学模型
这种很抽象的东西没有式子描述一下显然是下不了手的。
因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\)意义下。
设\(a_i\)表示\(i\)号区间长度;
对于上行列车(\(0\rightarrow n\))设\(p_0\)表示出发时刻,\(p_i(i\ge1)\)表示在\(i\)站停靠时间;
对于下行列车(\(0\leftarrow n\))设\(-q_0\)表示到站时刻,\(q_i(i\ge1)\)表示在\(i\)站停靠时间;
(转化成\(-q_0\)是为了后面表示方便)
用大写字母\(A,P,Q\)分别表示它们的前缀和。
如果某区间\(b_i=1\),则两列车的行驶时间区间不交,即
\]
区间不交即端点不被包含,可以列出不等式(被取模了所以看着比较奇怪)
\]
记\(x=P_{i-1}+Q_{i-1}\),移项,解得\(x\in[-2A_{i-1},-2A_i]\)
因为\(P,Q\)是递增的,所以我们的问题变成了:
有若干个限制区间\([l_i,r_i]\),你手头有一个数\(x\),初值任选,每次可以加一个非负整数使它落在区间内,求最少总共加多少能满足限制。
优化求解
考虑这样一个贪心的决策过程:
假设我们知道当前的\(x\),我们需要统计它最少总共被加了多少。我们看上一个限制区间。
如果\(x\)被上一个区间包含,那么我们看上上个区间。
如果\(x\)没有被上一个区间包含,则\(x\)从区间的右端点加过来的代价最小,我们继续对上上个区间的右端点进行决策。
发现我们决策的中间状态只和区间右端点有关,所以我们设\(f_i\)表示决策到第\(i\)个区间时,\(x=r_i\)的最小代价。
我们对于每个值维护最后一个没有包含这个值的区间编号,每次取出\(r_i\)对应的编号(记为\(j\)),用\(f_j+r_i-r_j\)更新\(f_i\),并将\([r_i+1,l_i-1]\)的编号全部设为\(i\)。
最后把所有的\(l_i\)丢进去查一下取个\(\min\)加上\(2A_n\)就是答案。
因为是区间设置所以可以珂朵莉树维护,不用离散化,因为随机数据的编号段数不会太大所以平均情况下跑得比线段树还快。
特判:如果\(2a_i>k\)那么puts("-1")
#include<bits/stdc++.h>
#define LL long long
#define R register int
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
using namespace std;
const int SZ=1<<19,N=1e5+9;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){
G;while(*ip<'-')G;
R x=*ip&15;G;
while(*ip>'-'){x*=10;x+=*ip&15;G;}
return x;
}
int k,l[N],r[N];LL f[N];bool b[N];
struct Node{
int r;mutable int v;
inline Node(R a,R b=0):r(a),v(b){}
inline bool operator<(const Node&a)const{return r<a.r;}
};
typedef set<Node>::iterator IT;
set<Node>s;
inline IT Split(R p){
IT i=s.lower_bound(Node(p));
return i->r!=p?s.insert(Node(p,i->v)).first:i;
}
inline void Set(R l,R r,R v){
if(l>r)return;
IT il=Split(l-1),ir=Split(r);
ir->v=v;s.erase(++il,ir);
}
inline LL Calc(R p){
R j=s.lower_bound(Node(p))->v;
return j?f[j]+(p-r[j]+k)%k:0;
}
int main(){
R n=in();LL k=::k=in(),a=0,a1=0,ans=1e18;
s.insert(Node(-1));
s.insert(Node(k-1));
for(R i=1;i<=n;++i){
a1=a;a+=in();
if(!(b[i]=in()&1))continue;
if(2*(a-a1)>k)return puts("-1"),0;
l[i]=(-2*a1%k+k)%k;r[i]=(-2*a%k+k)%k;
f[i]=Calc(r[i]);
if(l[i]>r[i])Set(r[i]+1,l[i]-1,i);
else Set(0,l[i]-1,i),Set(r[i]+1,k-1,i);
}
for(R i=1;i<=n;++i)
if(b[i])ans=min(ans,Calc(l[i]));
cout<<ans+2*a<<endl;
return 0;
}
洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)的更多相关文章
- 洛谷P2787 语文1(chin1)- 理理思维(珂朵莉树)
传送门 一看到区间推倒……推平操作就想到珂朵莉树 区间推平直接assign,查询暴力,排序的话开一个桶统计,然后一个字母一个字母加就好了 开桶统计的时候忘了保存原来的左指针然后挂了233 //mina ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷 P5350 序列 珂朵莉树
题目描述 分析 操作一.二.三为珂朵莉树的基本操作,操作四.五.六稍作转化即可 不会珂朵莉树请移步至这里 求和操作 把每一段区间分别取出,暴力相加 ll qh(ll l,ll r){ it2=Spli ...
- [Agc011F] Train Service Planning
[Agc011F] Train Service Planning 题目大意: 有n+1个车站,n条轨道,第i条轨道联通i-1和i车站,通过它要花a[i]时间,这条轨道有b[i]=1或2条车道,也就是说 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...
- [洛谷P3987]我永远喜欢珂朵莉~
[洛谷P3987]我永远喜欢珂朵莉~ 题目大意: 给你\(n(n\le10^5)\)个数\(A_{1\sim n}(A_i\le5\times10^5)\),\(m(m\le5\times10^5)\ ...
随机推荐
- 广州商学院16级软工一班&二班-第一次作业成绩
广州商学院16级软工一班&二班-第一次作业成绩 作业地址 16软工一班 16软工二班 总结 本次作业反映了几个比较严重的问题: 不按要求阅读相应的文章,回答问题只是敷衍几句. 部分同学的版式混 ...
- 一种简单有效的VBA源代码加密办法,支持64位宿主,适用于大部分VBA代码加密
原始出处:http://www.cnblogs.com/Charltsing/p/EncryptVBACode.html VBA代码加密是个老生常谈的问题,自从本人的VBA Dumper发布之后,在O ...
- iOS上手指点击波纹效果的实现
https://www.jianshu.com/p/35e6f53ca0fe 2016.10.19 22:00* 字数 135 阅读 2468评论 2喜欢 7 闲暇时间做了一个反馈手指点击屏幕的效果, ...
- (Git 学习)Git SSH Key 创建步骤
首先感谢segmentfalut上的朋友对我帮助. 首先:查看你是否有../ssh 这个文件:怎么查看:找到你的git安装目录,在安装目录下查看是否./ssh,以我的为例: 在C盘/Users/11/ ...
- xmanager 乱码
xmanager连接后中文显示乱码 - 程序员CC - 博客园http://www.cnblogs.com/aomidata/p/3445075.html Xshell 为什么会出现中文乱码?-Xma ...
- Mysql之常用操作(2)
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- http1.0 1.1 与2.0
长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一 ...
- react 路由 react-router-dom
import React from 'react'; import DataList from './data' import Tr from './Tr' // import One from '. ...
- Tomcat异常及解决办法——持续更新中
公司项目,开发语言为java,中间件为Tomcat,运行过程中,从Tomcat出现了一些异常,现将异常及解决办法记录如下,仅供参考.(不断在补充中.......) 异常一: 1.日志内容 org.ap ...
- laravel 项目表单中有csrf_token,但一直报错419错误 解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persi
laravel 项目表单中有csrf_token,但一直报错419错误,因为项目中使用到Redis缓存,在强制关闭Redis后出现的问题,查询laravel.log文件查找相关问题 安装redis后在 ...