SlideShare a Scribd company logo
1 of 11
Download to read offline
会津合宿 2017 Day3
F - 掛け算は楽しい -
原案:鈴木
問題文:栗田
解答:鈴木、栗田、杉江
解説:鈴木
2017/09/20
問題概要
問題
長さ N の実数列 S = (s1, s2, . . . , sN ) と実数 K が与えられる
連続する部分列 P = (sℓ, sℓ+1, . . . , sr) (l ≤ r) で,Πr
i=ℓsi ≤ K を満た
すものの中で,最長のものを求めよ
無い場合は 0 を出力
制約
1 ≤ N ≤ 100, 000
1 ≤ K ≤ 1, 048, 576
0.0 ≤ si ≤ 2.0
2 / 11
まず,やらなければならないこと
自明なケース
si = 0 なる i (1 ≤ i ≤ N) があるならば,答えは N
log を取る
純粋に掛け算をしてしまうとオーバーフローする
そこで,各 si (1 ≤ i ≤ N) について,s′
i = log si とした数列
S′ = (s′
1, s′
2, . . . , s′
N ) 上で問題を考える
自明なケースで si = 0 なる i はないので log を取れる
また,K′ = log K とする
すると,Πr
i=ℓsi ≤ K の代わりに
∑r
i=ℓ s′
i ≤ K′ で考えることができ,
オーバーフローしない
3 / 11
誤解法例 1
全探索
ℓ ≤ r であるインデックスの組 (ℓ, r) をすべて試す
O(N2
) で,これは TLE
4 / 11
誤解法例 2
しゃくとり法
ℓ = 0, r = 0, ans = 0 から初めて l ≤ r であるように管理∑r
i=ℓ s′
i ≤ log K′
である間 r ← r + 1
ans ← max{ans, r − ℓ + 1} としたのち ℓ ← ℓ + 1 とする
O(N) なので TLE はしない
目的値に単調性 (今回は広義単調増加) がないと正しくない
0.0 ≤ si ≤ 2.0 という制約から s′
i は正にも負にもなりうる
よって,足し算が広義単調増加でないため WA
5 / 11
とりあえずやること
累積和
imos[x] =
∑x
i=1 s′
i となるような配列 imos を作る
imos[0] ← 0
imos[i] ← imos[i − 1] + s′
i (i = 1, . . . , N)
O(N) で生成可能
∑r
i=ℓ s′
i = imos[r] − imos[l − 1] となる性質を持つ
※親しみやすく (?) するために imos を使っています
6 / 11
方針
各 ℓ (1 ≤ ℓ ≤ N) について,
∑r
i=ℓ s′
i ≤ K′ を満たす最大の r(≥ ℓ) を
高速に見つける
imos の性質を用いて
∑r
i=ℓ s′
i ≤ K′
を変形すると
imos[r] ≤ K′
+ imos[l − 1] (1)
そこで,imos を用いて (1) を満たす最大の r を求める
ところで,imos は単調性を満たさないので二分探索は使えない
かといって,線形探索をすると O(N2) 解となり,これは TLE
7 / 11
解決策
二分探索を使えるように imos を変形
i < j (1 ≤ i, j ≤ N) について,imos[i] > imos[j] ならば i が r とし
て選ばれることはない
つまり,以下のような配列 imos′ 上で考えても答えは同じ
imos′
[i] ← min{imos[i], imos[i + 1], . . . , imos[N]}
imos′
は単調性を満たす
imos′ は累積和と似たように計算可能
imos′
[i] ← min{imos[i], imos′
[i + 1]} (i = N − 1, N − 2, . . . , 0)
計算量は O(N)
8 / 11
想定解法まとめ
imos を計算 : O(N)
imos′ を計算 : O(N)
各 ℓ (1 ≤ ℓ ≤ N) について,imos′[r] ≤ K′ + imos[l − 1] となる最大
の r を計算
C++での例
upper_bound(imos′
.begin(), imos′
.end(), K′
+ imos[l − 1]) − ℓ − 1
計算量は O(log N)
全体で O(N log N)
9 / 11
Writer 解
栗田 (C++, 32 行)
鈴木 (C++, 38 行) (python, 42 行)
杉江 (C++, 79 行) ※ imos′ を作る代わりに Segment Tree を使用し
た別解
10 / 11
提出状況
First AC
Onsite : acpc_ufk (171 min)
Online : pekempey (57 min)
正答率
7 / 35 (20.00%)
11 / 11

More Related Content

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 

Recently uploaded

Recently uploaded (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

ACPC 2017 Day3 F: 掛け算は楽しい

  • 1. 会津合宿 2017 Day3 F - 掛け算は楽しい - 原案:鈴木 問題文:栗田 解答:鈴木、栗田、杉江 解説:鈴木 2017/09/20
  • 2. 問題概要 問題 長さ N の実数列 S = (s1, s2, . . . , sN ) と実数 K が与えられる 連続する部分列 P = (sℓ, sℓ+1, . . . , sr) (l ≤ r) で,Πr i=ℓsi ≤ K を満た すものの中で,最長のものを求めよ 無い場合は 0 を出力 制約 1 ≤ N ≤ 100, 000 1 ≤ K ≤ 1, 048, 576 0.0 ≤ si ≤ 2.0 2 / 11
  • 3. まず,やらなければならないこと 自明なケース si = 0 なる i (1 ≤ i ≤ N) があるならば,答えは N log を取る 純粋に掛け算をしてしまうとオーバーフローする そこで,各 si (1 ≤ i ≤ N) について,s′ i = log si とした数列 S′ = (s′ 1, s′ 2, . . . , s′ N ) 上で問題を考える 自明なケースで si = 0 なる i はないので log を取れる また,K′ = log K とする すると,Πr i=ℓsi ≤ K の代わりに ∑r i=ℓ s′ i ≤ K′ で考えることができ, オーバーフローしない 3 / 11
  • 4. 誤解法例 1 全探索 ℓ ≤ r であるインデックスの組 (ℓ, r) をすべて試す O(N2 ) で,これは TLE 4 / 11
  • 5. 誤解法例 2 しゃくとり法 ℓ = 0, r = 0, ans = 0 から初めて l ≤ r であるように管理∑r i=ℓ s′ i ≤ log K′ である間 r ← r + 1 ans ← max{ans, r − ℓ + 1} としたのち ℓ ← ℓ + 1 とする O(N) なので TLE はしない 目的値に単調性 (今回は広義単調増加) がないと正しくない 0.0 ≤ si ≤ 2.0 という制約から s′ i は正にも負にもなりうる よって,足し算が広義単調増加でないため WA 5 / 11
  • 6. とりあえずやること 累積和 imos[x] = ∑x i=1 s′ i となるような配列 imos を作る imos[0] ← 0 imos[i] ← imos[i − 1] + s′ i (i = 1, . . . , N) O(N) で生成可能 ∑r i=ℓ s′ i = imos[r] − imos[l − 1] となる性質を持つ ※親しみやすく (?) するために imos を使っています 6 / 11
  • 7. 方針 各 ℓ (1 ≤ ℓ ≤ N) について, ∑r i=ℓ s′ i ≤ K′ を満たす最大の r(≥ ℓ) を 高速に見つける imos の性質を用いて ∑r i=ℓ s′ i ≤ K′ を変形すると imos[r] ≤ K′ + imos[l − 1] (1) そこで,imos を用いて (1) を満たす最大の r を求める ところで,imos は単調性を満たさないので二分探索は使えない かといって,線形探索をすると O(N2) 解となり,これは TLE 7 / 11
  • 8. 解決策 二分探索を使えるように imos を変形 i < j (1 ≤ i, j ≤ N) について,imos[i] > imos[j] ならば i が r とし て選ばれることはない つまり,以下のような配列 imos′ 上で考えても答えは同じ imos′ [i] ← min{imos[i], imos[i + 1], . . . , imos[N]} imos′ は単調性を満たす imos′ は累積和と似たように計算可能 imos′ [i] ← min{imos[i], imos′ [i + 1]} (i = N − 1, N − 2, . . . , 0) 計算量は O(N) 8 / 11
  • 9. 想定解法まとめ imos を計算 : O(N) imos′ を計算 : O(N) 各 ℓ (1 ≤ ℓ ≤ N) について,imos′[r] ≤ K′ + imos[l − 1] となる最大 の r を計算 C++での例 upper_bound(imos′ .begin(), imos′ .end(), K′ + imos[l − 1]) − ℓ − 1 計算量は O(log N) 全体で O(N log N) 9 / 11
  • 10. Writer 解 栗田 (C++, 32 行) 鈴木 (C++, 38 行) (python, 42 行) 杉江 (C++, 79 行) ※ imos′ を作る代わりに Segment Tree を使用し た別解 10 / 11
  • 11. 提出状況 First AC Onsite : acpc_ufk (171 min) Online : pekempey (57 min) 正答率 7 / 35 (20.00%) 11 / 11