XSY2423 跳蚤(根號分治)

2022-05-20 16:46:03 字數 2262 閱讀 2139

神奇的分類討論。

首先注意到每次所有跳蚤都只會往右跳,也就是說只要某乙隻跳蚤跳出了 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

rlog⁡r

)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

(log⁡r

)o(\log r)

o(logr

),總時間 o(q

rlog⁡r

)o(q\sqrt r \log r)

o(qr

​logr)

。那麼我們就能在 o(q

rlog⁡r

)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...