比赛链接:[[https://atcoder.jp/contests/abc128|AtCoder Beginner Contest 128]] ==== E - Roadwork ==== === 题意 === 在一条直线上有 $N$ 个障碍,位于 $x_i$,且每个障碍仅在 $[S_i,T_i)$ 生效。有 $Q$ 个人从 $ x = 0$ 等待 $D_i$ 秒后出发,以每秒一单位长度的速度向正方向行走,遇到生效的障碍则立刻停下。输出每个人走的路程,如果无穷则输出 $-1$。 === 数据范围 === $1 \le N,Q \le 2\times 10^5$ $0 \le S_i,T_i \le 10^9$ $1 \le X_i \le 10^9$ $0 \le D_1 \lt D_2 \lt \cdots \lt D_Q \le 10^9$ === 题解 === 第 $j$ 个人在第 $i$ 个障碍停下当且仅当 $i$ 是满足 $S_i \le x_i + D_j \lt T_i$ 且 $x_i$ 最小的。也即 $S_i - x_i \le D_j \lt T_i - x_i$。 所以考虑对每个障碍按 $x_i$ 排序,然后从大到小枚举。每次二分得到满组 $S_i - x_i \le D_j \lt T_i - x_i$ 的一个区间,然后用线段树染色。 #include #define ll long long #define pii_ pair #define mp_ make_pair #define pb push_back #define fi first #define se second #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define show1(a) cout<<#a<<" = "<