More Related Content Similar to Indeedなう B日程 解説 (14) More from AtCoder Inc. (20) Indeedなう B日程 解説11. 11
●問題概要
• N人の社員がいる
• 社員 i は時刻 Si に出社し、時刻 Ti に退社する
• 自分がオフィスにいる間に入社した社員に対して
“How are you?” と聞く
• 各社員が何回 “How are you?” と聞くかを求めよ
• 1 ≦ N ≦ 10^5
• 1 ≦ Si < Ti ≦ 2N
14. 14
●満点解法
• Si の所が 1 でそれ以外が 0 であるような配列 A を考える
• すると、各 i について、A[Si] ~ A[Ti]の和を求めればいい
• 「ある区間の和」を高速に求めたい
• → 累積和
15. 15
●満点解法
• B[i] = A[0] ~ A[i] の和
• という配列 B を計算しておくと、
• A[L] ~ A[R] の和 = B[R] - B[L-1]
• として区間の和を求めることができる
20. 20
●部分点解法(40点)
• dp[i] = S の i 文字目までを作るときの最小コスト
• というDPをする
for (i = 0~N-1) {
for (j = 1~N-i) { // 使う回文の長さ
if (S[i]~S[i+j-1] が回文) {
dp[i+j] = min(dp[i+j], dp[i]+C[j])
}
}
}
22. 22
●満点解法
• ここを O(1) で計算できるようにしたい
for (i = 0~N-1) {
for (j = 1~N-i) { // 使う回文の長さ
if (S[i]~S[i+j-1] が回文) {
dp[i+j] = min(dp[i+j], dp[i]+C[j])
}
}
}
23. 23
●満点解法
• A[L][R] = S[L]~S[R] が回文かどうか
• というテーブルを前計算しておく
for (center = 0~N-1) {
L = R = center
while (L,R が範囲内かつ S[L] == S[R]) {
A[L][R] = 回文である
}
L = center, R = center+1
while (L,R が範囲内かつ S[L] == S[R]) {
A[L][R] = 回文である
}
}
39. 39
●解法
• セグ木の実装はBinary Indexed Treeが簡単
■計算量
• 座標圧縮はただのソートとユニーク処理,二分探索なので
合計でO(N log N)
• セグ木構築の空間計算量はO(N)
(※明らかに 1≦X[i]≦N (1-indexedの場合)なので)
• セグ木へのクエリにかかる時間計算量は合計でO(N log N)
• やっぱり全体として見ても
• 空間計算量 O(N)
• 時間計算量 O(N log N)