APCS 110/01 實作題第三題題解 切割費用
2021-01-09 17:00:42 by
題目敘述
有個長度 \(L\) 的棍子被切了 \(N\) 次,把一段棍子切下去一份為二的花費為該段棍子切割前的長度。
給你 \(N\) 次切割的切割點位置,請計算總花費。
輸入格式
\[
\begin{matrix}
N & L \\
x_1 & p_1 \\
x_2 & p_2 \\
... \\
x_N & p_N
\end{matrix}
\]
\(N \le 200000, L \le 10000000\)
\(0 < x_i < L\) ; 所有的 \(x\) 皆相異
\(1 \le p_i \le N\) 代表 \(x_i\) 是第幾次的切割點 ; 所有 \(p_i\) 皆相異
保證答案不超過 \(2^{60}\)
輸出格式
印出一個數字:總花費
範例輸入
2 10
3 2
9 1
範例輸出
19
題解
C++ 參考解答
可以使用 STL 的 std::set
儲存並快速找到鄰近切割點
#include <cstdio>
#include <algorithm>
#include <set>
const int NMAX = 200000;
int X[NMAX];
int main() {
int N, L;
scanf("%d%d", &N, &L);
for (int i = 0; i < N; i++) {
int x, p;
scanf("%d%d", &x, &p);
X[p - 1] = x;
}
long long ans = 0;
std::set<int> s {0, L};
for (int i = 0; i < N; i++) {
auto it = s.insert(X[i]).first;
ans += *next(it) - *prev(it);
}
printf("%lld\n", ans);
return 0;
}
[題解] [APCS] [APCS 110/01]