神奇的分類討論。
首先注意到每次所有跳蚤都只會往右跳,也就是說只要某乙隻跳蚤跳出了 max(
ri)\max(r_i)
max(ri
)它就不會再有貢獻了。(和 火神的魚 類似)
令 r
=max(
ri)r=\max(r_i)
r=max(ri
)。考慮根號分治,將所有的跳蚤分成兩類:將 t
i>
rt_i> \sqrt
ti>r
的分為第一類,將 ti≤
rt_i\leq \sqrt
ti≤r
的分為第二類。
對於第一類,我們暴力維護這些魚的位置,因為他們最多跳 r
\sqrt
r次就會跳出 r
rr 了,也就是不會再有貢獻了。
維護的過程可以用樹狀陣列,時間複雜度 o(q
rlogr
)o(q\sqrt r \log r)
o(qr
logr)
。對於第二類,我們考慮對於每一種 t
it_i
ti,維護一棵權值線段樹,共 r
\sqrt r
r棵,那麼對於每一種 t
it_i
ti,根據題目的詢問 [l,
r][l,r]
[l,r
],我能還原這些跳蚤一開始應該在那個區間 [l′
,r′]
[l',r']
[l′,r′
],然後在這顆線段樹內查詢這個區間。
共 r
\sqrt r
r棵線段樹,每棵查詢 o
(logr
)o(\log r)
o(logr
),總時間 o(q
rlogr
)o(q\sqrt r \log r)
o(qr
logr)
。那麼我們就能在 o(q
rlogr
)o(q\sqrt r \log r)
o(qr
logr)
的時間內維護所有操作了。
**如下:
#include
#define ln 17
#define sn 310
#define n 100010
#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]
#define lowbit(x) (x&-x)
using
namespace std;
const
int sn=
300,n=
100000
;struct data
;data
(int a,
int b)
}p[n]
;struct tree
t[n*ln]
;int q,tot;
int node,root[sn]
;int c[n]
;void
add(
int x,
int y)
intgetsum
(int x)
void
update
(int
&k,int l,
int r,
int x)
intquery
(int k,
int l,
int r,
int ql,
int qr)
intmain()
else
update
(root[t],-
3e7,
3e7,x-tim*t)
;//還原0時刻這只跳蚤應該在什麼位置}if
(opt==2)
} tot=tmp;}if
(opt==3)
}return0;
}
2 4 2 使用救援光碟
一些 linux 發行版本 例如 opensuse 在安裝光碟中包含了 救援模式 用於緊急情況下執行對系統的修復。要進入救援模式,首先用 2.2.1 節的方法用安裝光碟啟動計算機,選擇 rescue system 救援系統 命令,如圖 2.23 所示。在這個模式下,使用者可以在不提供口令的情況下以 ...
242 計算球體積
時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 根據輸入的半徑值,計算球的體積。輸入 輸入資料有多組,每組佔一行,每行包括乙個實數,表示球的半徑。0輸出 輸出對應的球的體積,對於每組輸入資料,輸出一行,計算結果四捨五入為整數 hint pi 3.1415926 樣例輸入 1 ...
2 4 2Python self擴充套件
總目錄 python 子目錄 在類基礎中簡單說過self的用法和含義。這裡我們細說一下。首先定義乙個類 class dog object pass dog dog 因為類有模板的作用,因此,可以在建立例項的時候,把我們認為必須繫結的屬性強制填寫進去。這裡就用到python當中的乙個內建方法 init...