题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f

题目大意:

现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站台,区间\(i\)连接站台\(i-1\)和\(i\)

一列火车经过区间\(i\)会消耗\(A_i\),区间内的铁路是单向或者是双向的,现在你需要设计一个火车时间表,满足:

  • 所有火车从\(0\)到\(n\)或从\(n\)到\(0\)
  • 火车在区间中不得逗留
  • 两列同向的火车之间的时间间隔为\(K\)
  • 单向区间不得有两列相向而行的火车同时经过

输出某辆列车从\(0\)到\(n\)再返回的最小时间


我们记车\(0\)(终点为\(n\))在车站\(i\)等待了\(P_i\)分钟,记车\(1\)(终点\(0\))在车站\(i\)等待了\(-Q_i\)分钟,由于是在\(\%K\)意义下,所以这样是没有问题的

\(P_i\)和\(Q_i\)显然为非负整数,考虑对于某条单向区间\(x\),有:

车\(0\)在第\(x\)条铁路上的区间为\((\sum\limits_{i=1}^{x-1}A_i+\sum\limits_{i=0}^{x-1}P_i,\sum\limits_{i=1}^xA_i+\sum\limits_{i=0}^{x-1}P_i)\)

车\(1\)在第\(x\)条铁路上的区间为\((\sum\limits_{i=1}^{x-1}-A_i+\sum\limits_{i=0}^{x-1}-Q_i,\sum\limits_{i=1}^x-A_i+\sum\limits_{i=0}^{x-1}-Q_i)\)

显然这两个区间长度是一样的,然后由于这两个区间交集为空,于是我们可以转化为端点的不等式,解得\(\sum\limits_{i=0}^{x-1}P_i+Q_i\notin(-2\sum\limits_{i=1}^xA_i,-2\sum\limits_{i=1}^{x-1}A_i)\),我们设这段区间的补集为\([L_i,R_i]\),得到\(\sum\limits_{i=0}^{x-1}P_i+Q_i\in[L_i,R_i]\)

记\(S_x=\sum\limits_{i=0}^xP_i+Q_i\),答案即为\(S_n+2\sum\limits_{i=1}^{n}A_i\)问题转化为我们要最小化\(S_{n}\),且满足\(S_i\in[L_i,R_i]\),那么这题就成了:给定\(n\)个区间,任选起点,走\(n\)步,第\(i\)步需要落在区间\([L_i,R_i]\)中,求最小总路径长度

这显然是可以dp的,而且有个很显然的贪心结论:如果起点确定,那么每次走到下一个区间的左端点最优

于是我们设\(f_i\)表示当前在区间\([L_i,R_i]\),一直走到\(n\)的最短路径,那么每次转移时,我们需要找到一个\(j\)满足\(L_j\notin[L_i,R_i],i<j\),且\(j\)最小,转移即为\(f_i=f_j+dis(L_i,L_j)\),找\(j\)的过程是可以用线段树优化的,直接进行补集覆盖即可

最后枚举所有的起点得到最优解,加上\(\sum\limits_{i=1}^nA_i\)输出即可

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=1e5;
struct S1{
#define ls (p<<1)
#define rs (p<<1|1)
int tree[(N<<3)+10];
void pushdown(int p){
if (!tree[p]) return;
tree[ls]=tree[rs]=tree[p];
tree[p]=0;
}
void Modify(int p,int l,int r,int x,int y,int v){
if (x>y) return;
if (x<=l&&r<=y){
tree[p]=v;
return;
}
pushdown(p);
int mid=(l+r)>>1;
if (x<=mid) Modify(ls,l,mid,x,y,v);
if (y>mid) Modify(rs,mid+1,r,x,y,v);
}
int Query(int p,int l,int r,int x){
if (l==r) return tree[p];
pushdown(p);
int mid=(l+r)>>1;
if (x<=mid) return Query(ls,l,mid,x);
else return Query(rs,mid+1,r,x);
}
#undef ls
#undef rs
}ST;//Segment Tree
int A[N+10],B[N+10];
int L[N+10],R[N+10];
ll sum[N+10],f[N+10];
int list[(N<<1)+10];
int n,K,T,tot;
ll Get(int x){
int tmp=ST.Query(1,1,T,x);
if (!tmp) return 0;
return f[tmp]+(list[L[tmp]]-list[x]+K)%K;
}
int main(){
n=read(),K=read();
bool flag=0;
for (int i=1;i<=n;i++){
A[i]=read(),B[i]=read();
sum[i]=sum[i-1]+A[i];
if (B[i]==2) continue;
if (2*A[i]>K) flag=1;
}
if (flag){
printf("-1\n");
return 0;
}
for (int i=1;i<=n;i++){
if (B[i]==1){
L[i]=(-2*sum[i-1]%K+K)%K;
R[i]=(-2*sum[i ]%K+K)%K;
}else L[i]=0,R[i]=K-1;
list[++tot]=L[i];
list[++tot]=R[i];
}
sort(list+1,list+1+tot);
T=unique(list+1,list+1+tot)-list-1;
for (int i=1;i<=n;i++){
L[i]=lower_bound(list+1,list+1+T,L[i])-list;
R[i]=lower_bound(list+1,list+1+T,R[i])-list;
}
for (int i=n;i;i--){
f[i]=Get(L[i]);
if (R[i]<L[i]) ST.Modify(1,1,T,R[i]+1,L[i]-1,i);
else ST.Modify(1,1,T,1,L[i]-1,i),ST.Modify(1,1,T,R[i]+1,T,i);
}
ll Ans=f[1];
for (int i=1;i<=T;i++) Ans=min(Ans,Get(i));
printf("%lld\n",Ans+2*sum[n]);
return 0;
}

AtCoder Grand Contest 011 F - Train Service Planning的更多相关文章

  1. 【Atcoder Grand Contest 011 F】Train Service Planning

    题意:给\(n+1\)个站\(0,\dots,n\),连续的两站\(i-1\)和\(i\)之间有一个距离\(A_i\),其是单行(\(B_i=1\))或双行(\(B_i=2\)),单行线不能同时有两辆 ...

  2. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  3. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  4. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

  5. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...

  6. AtCoder Grand Contest 010 F - Tree Game

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...

  7. AtCoder Grand Contest 016 F - Games on DAG

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...

  8. Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)

    洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...

  9. Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)

    洛谷题面传送门 & Atcoder 题面传送门 一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...

随机推荐

  1. 我对hibernate和mybatis框架的比較

    系统在选择操作数据库的框架上面,究竟是选择hibernate,还是mybatis. 首先说下两者的原理,假设你要关联几张表做查询,查出20条记录: 1.假设是mybatis SELECT *   FR ...

  2. device not managed by NetworkManager

    Bringing up interface eth0:Error:Connection activation failed:Device not managed by  NetworkManager ...

  3. HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

    状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j]  ...

  4. sanic官方文档解析之静态文件和版本

    1,静态文件 就向图片文件一样,静态文件和指导性的文件,当通过Sanic服务端用app.static()方法注册的时候,这种方法采用端点url和文件名称获得.这样的文件的指定,将会通过指定的端点访问. ...

  5. Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学

    D. My pretty girl Noora     In Pavlopolis University where Noora studies it was decided to hold beau ...

  6. 如何去除Office Excel的密码保护?

    企图更改Excel文件内容,然而却弹出如下提示: 根据提示,我尝试解除保护表,却要求输入密码: 这就尴尬了=_=密码不是我设定的 问了度娘,找到了解决方案 将Excel文件扩展名更改为rar, 使用压 ...

  7. HTML——使用表格进行页面布局

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法

    測试样例: Java读取UTF-8的txt文件第一行出现乱码"?"及解决 test.txt文件内容: 1 00:00:06,000 --> 00:00:06,010 < ...

  9. luogu2398 SUM GCD

    题目大意:求sum i(1->n) (sum j(1->n) (gcd(i,j))). 对于每对(i,j)都来一次gcd很慢,但是我们知道,一个约数i在1~n范围内是n/i个数的约数.gc ...

  10. 20170224 SE11删除数据

    目的,批量删除错误条目.1.SE11 通过条件找到目标数据,并选中: 2./H 进入debug,回车,更改值 OK_CODE  =  DEL5 F8 运行则出现删除框,