【线段树】2021牛客暑期多校训练营1 J Journey among Railway Stations
2021-08-27 13:21:00
# ACM
题目解析
给定每个车站的停车时间区间以及相邻车站之间的路程花费时间,包含三个操作:
$1.$ $0$ $L$ $R$ 表示车从 $L$ 出发能否在 $[L,R]$ 所有车站都停留;
$2.$ $1$ $i$ $w$ 表示将第 $i$ 段路的时间花费改为 $w$;
$3.$ $2$ $i$ $p$ $q$ 表示将第 $i$ 个车站的停车时间区间改为 $[p,q]$;
线段树维护区间问题;
定义车站区间: $L$ 到 $R$ 的车站集合;
定义节点信息:{
最早出发时间 $op$ ;
最晚到达时间 $ed$ ;
该车站区间前一段路的花费 $precost$ ;
该车站区间总路程花费 $sumcost$ ;
该车站区间 $L$ 到 $R$ 是否可达 $ok$ ;
}
对于两个节点的合并:
有相邻两车站区间 $t1,t2$,$t2$ 在 $t1$ 之后,设合并结果为 $t$,因为 $t1$ 到 $t2$ 有一段中间路程 $cost$,也就是 $t2$ 的 $precost$,则设 $t2’$ 为 $t2$ 的 $op,ed$ 都减去 ( $t2.precost + t1.sumcost$ ),那么:
$t.op = max(t1.op,t2’.op)$;
$t.ed = min(t1.ed,t2’.ed)$;
$t.precost = t1.precost$;
$t.sumcost = t1.sumcost + t2’.sumcost + t2’.precost$;
$t.ok = t1.ok$ && $t2.ok$ && $(t1.op <= t2.op)$;
两个修改就直接修改节点对应信息,查询就合并后查 $ok$ 的值;
代码实现
1 |
|