博客背景
OI/ACM中,在做區間查詢,區間修改等問題的時候,經常會聽到各位大佬說到“離線”、“在線”等令我一臉懵逼的名詞,所以決定要搞懂是什么意思
博客正文
一.簡單的理解
在線和離線可以簡單的理解為對於所有的操作是否需要讀入完畢。
二.標准理解和要求
在線的要求是可以不用先知道所有的操作(類似詢問、修改),邊讀入邊執行,類似“走一步,做一步”的思想。
離線則與在線相反,要求必須知道所有的操作,類似"記錄所有步,回頭再做”的思想,一般用Query[ ]記錄所有操作。
三.常見的算法
常見的在線算法:帶有“可持久化”字樣的(主席樹、可持久化線段樹、可持久化字典樹等等),其實正常寫題時基本上都是在線的思路……
常見的離線算法:整體二分、CDQ分治、莫隊算法
四.應用
對於正常的題目來講,兩種算法其實都可以使用,經典的題目如:動態第K大問題(ZOJ2112),解法有樹套樹(在線)和整體二分/CDQ分治(離線),但是區別在於:
在線算法的思路相對簡單,而代碼量大(如某些毒瘤題),容易爆棧,賽場上及其考驗心態
離線算法的思路相對復雜,而代碼量小,建議選手多采用(畢竟代碼越多,DEBUG越困難)
五.強制在線
對於一些不正常的題目(強制在線),只能老老實實碼數據結構了
強制在線的例子如:當前讀入的數據需要xor上一次的結果、交互式等