题解 【AT2342 [AGC011F] Train Service Planning】
command_block · · 题解
题意 : 有一条铁路,被
列车通过第
现在需要设计一张列车(循环)时刻表。
对于所有的列车,要么从站台
在单向轨道内,不能有两辆相反方向的车互相穿过。列车只能在站点停车等待。
若有一辆开往
需要使得时间表中
下行车的区间为
实际上下行车的式子是全体减去前缀得到后缀,但是走一整次所需的时间是
若这是单向铁路,要求两个区间(在模
记
对
-
于是问题可以转化为 :
你有一个变量
x ,初始值任意。每次会给出一个模
k 意义下的区间,要求给x 加一定值,使得x 落在这个区间内。最小化加上的值的和。
(在本题中,还需加上
2St(n) 才是答案)
考虑
显然我们需要关心的
边界 :
每次操作时,设给出的模意义区间为
维护
复杂度
#include<algorithm>
#include<cstdio>
#define ll long long
#define MaxN 100500
using namespace std;
const ll INF=1ll<<60;
ll x[MaxN<<1];int tn;
struct Node{
ll x;bool fl;
inline void ladd(){x=INF;fl=1;}
}a[MaxN<<2];
inline void up(int u)
{a[u].x=min(a[u<<1].x,a[u<<1|1].x);}
void build(int l=1,int r=tn,int u=1)
{
if (l==r){a[u].x=-x[l];return ;}
int mid=(l+r)>>1;
build(l,mid,u<<1);
build(mid+1,r,u<<1|1);
up(u);
}
inline void ladd(int u){
if (a[u].fl){
a[u<<1].ladd();
a[u<<1|1].ladd();
a[u].fl=0;
}
}
int to,wfl,wfr;ll wfc,ret;
void qry(int l=1,int r=tn,int u=1)
{
if (wfl<=l&&r<=wfr){
ret=min(ret,a[u].x);
return ;
}int mid=(l+r)>>1;ladd(u);
if (wfl<=mid)qry(l,mid,u<<1);
if (mid<wfr)qry(mid+1,r,u<<1|1);
}
void clr(int l=1,int r=tn,int u=1)
{
if (wfl<=l&&r<=wfr){a[u].ladd();return ;}
int mid=(l+r)>>1;ladd(u);
if (wfl<=mid)clr(l,mid,u<<1);
if (mid<wfr)clr(mid+1,r,u<<1|1);
up(u);
}
void chg(int l=1,int r=tn,int u=1)
{
if (l==r){
a[u].x=min(a[u].x,wfc-x[l]);
return ;
}int mid=(l+r)>>1;ladd(u);
if (to<=mid)chg(l,mid,u<<1);
else chg(mid+1,r,u<<1|1);
up(u);
}
ll dfs(int l=1,int r=tn,int u=1)
{
if (l==r)return a[u].x+x[l];
int mid=(l+r)>>1;ladd(u);
return min(dfs(mid+1,r,u<<1|1),dfs(l,mid,u<<1));
}
int n,m,k;
ll t[MaxN];
struct Data{ll l,r;}b[MaxN];
int main()
{
scanf("%d%d",&n,&k);
for (int i=1,op;i<=n;i++){
scanf("%lld%d",&t[i],&op);
if (op==1&&2*t[i]>k){puts("-1");return 0;}
t[i]+=t[i-1];
if (op==1)
b[++m]=(Data){(k-2*t[i-1]%k)%k,(k-2*t[i]%k)%k};
}
for (int i=1;i<=m;i++){
x[++tn]=b[i].l;
x[++tn]=b[i].r;
}x[++tn]=0;
sort(x+1,x+tn+1);
tn=unique(x+1,x+tn+1)-x-1;
build();
for (int i=1;i<=m;i++){
int tl=lower_bound(x+1,x+tn+1,b[i].l)-x,
tr=lower_bound(x+1,x+tn+1,b[i].r)-x;
wfc=INF;
if (tl<=tr){
wfl=1;wfr=tl-1;
if (wfl<=wfr){
ret=INF;qry();clr();
wfc=b[i].l+ret;
}
wfl=tr+1;wfr=tn;
if (wfl<=wfr){
ret=INF;qry();clr();
wfc=min(wfc,b[i].l+k+ret);
}
}else {
wfl=tr+1;wfr=tl-1;
if (wfl<=wfr){
ret=INF;qry();clr();
wfc=b[i].l+ret;
}
}to=tl;chg();
}printf("%lld",2*t[n]+dfs());
return 0;
}