挖坑 GSS系列 GSS4 區間開平方

2021-09-12 21:53:23 字數 3379 閱讀 6742

can you answer these queries?

gss系列是spoj出品的一套資料結構好毒瘤題,主要以線段樹、平衡樹和樹鏈剖分為背景,進行了一些操作的魔改,使得難度遠超模板題,但對於思維有極大的提公升。

所以我會選擇一些在我能力範圍內的題挖坑選講,構成乙個gss系列。至於剩下那些,等我成為巨佬弄懂了再說吧。

這道題可能是gss系列中的乙個另類吧,因為它並沒有涉及到最大子段和,而且難度也不是特別大,是乙個經典的套路題。但其精妙之處就在於資料結構與暴力的完美結合。

原題傳送門(洛谷)

給定一段區間,要求支援區間開平方(下取整)和查詢區間和。

這題真的沒什麼可以**的

本題最大的問題在於區間開方後不能在o(1

)o(1)

o(1)

時間內維護區間和。但是不管你用什麼辦法,你永遠無法把區間開平方和區間和聯絡起來。所以此題需要另闢蹊徑。(n

logn

)o(nlogn)

o(nlog

n),只不過有比較大的常數。

具體實現中,如何判斷整個區間為1是最重要的。主要有兩種實現方式:

線段樹同時維護區間最大值,如果區間最大值已經為1,那麼整個區間一定均小於等於1(可能為0)。

線段樹每個節點增加乙個tag

tagta

g,表示這段區間是否為1,乙個節點的tag在push_up時由兩個子節點進行與運算得到,只有兩個子節點均為1時,父親節點才為1.

#include

#define reset(x) memset(x, 0, sizeof(x))

#define lc(x) (x<<1)

#define rc(x) (x<<1|1)

#define mid (l+r>>1)

#define ll long long

#define max 100005

using

namespace std;

int n, m, t;

ll a[max]

, sum[max*4]

, ma[max*4]

;void

push_up

(int p)

void

build

(int p,

int l,

int r)

build(lc

(p), l, mid)

;build(rc

(p), mid+

1, r)

;push_up

(p);

}void

update

(int p,

int l,

int r,

int ul,

int ur)

if(l == r)

if(mid >= ul)

if(mid < ur)

push_up

(p);

}ll query

(int p,

int l,

int r,

int ul,

int ur)

ll res =0;

if(mid >= ul)

if(mid < ur)

return res;

}void

solve()

if(t>1)

puts(""

);printf

("case #%d:\n"

, t)

;build(1

,1, n)

; cin >> m;

int t, x, y;

for(

int i =

1; i <= m; i++

)else}}

intmain()

return0;

}

#include

#define max 100005

#define ll long long

#define lc(x) (x<<1)

#define rc(x) (x<<1|1)

#define mid ((l+r)>>1)

using

namespace std;

template

<

typename t>

inline

void

read

(t &n)

template

<

typename t>

void

write

(t n)

int n, m;

ll a[max]

, s[max*4]

, tag[max*4]

;inline

void

push_up

(int p)

void

build

(int p,

int l,

int r)

build(lc

(p), l, mid)

;build(rc

(p), mid+

1, r)

;push_up

(p);

}void

update

(int p,

int l,

int r,

int ul,

int ur)

if(mid >= ul)

update(lc

(p), l, mid, ul, ur);if

(mid < ur)

update(rc

(p), mid+

1, r, ul, ur)

;push_up

(p);

}ll query

(int p,

int l,

int r,

int ul,

int ur)

ll res =0;

if(mid >= ul) res +

=query(lc

(p), l, mid, ul, ur);if

(mid < ur) res +

=query(rc

(p), mid+

1, r, ul, ur)

;return res;

}int

main()

build(1

,1, n)

;read

(m);

int t, l, r;

for(

int i =

1; i <= m; i++

)else

}return0;

}

挖坑系列之Fx初窺

實現乙個可以與瀏覽器互動輸出 hello world 的web服務的典型做法是啟動乙個http服務並執行自定義的路由。以下 片段,我們通過使用go內建net http包不需要外部依賴即可實現。func main 準備好上述 我們通過終端cd到對應目錄,執行go run main.go即可發現我們的w...

我要挖坑了系列 模板合集

嗨咻 挖個大坑 已填坑 14 50 2019.07.27 字串名詞介紹 kmp 擴充套件kmp manacher ac自動機 待填 字尾陣列 待填 字尾自動機 待填 字串hash 待填 認識基本object 點 線 面 交點 面積的計算 對稱 平移和旋轉 待填 三角形與圓 待填 最小圓覆蓋 待填 卷...

挖坑 搜尋相關

演算法中最基本和常用的是搜尋,這裡要說的是,有些初學者在學習這些搜尋基本演算法是不太注意剪枝,這是十分不可取的,因為所有搜尋的題目給你的測試用例都不會有很大的規模,你往往察覺不出程式執行的時間問題,但是真正的測試資料一定能過濾出那些沒有剪枝的演算法。實際上參賽選手基本上都會使用常用的搜尋演算法,題目...