資訊競賽高階指南 線段樹(模板)

2022-09-15 05:21:12 字數 2236 閱讀 3919

struct segmenttree  t[size *4]

;// struct陣列儲存線段樹

void

build

(int p,

int l,

int r)

// 葉節點

int mid =

(l + r)/2

;// 折半

build

(p*2

, l, mid)

;// 左子節點[l,mid],編號p*2

build

(p*2+1

, mid+

1, r)

;// 右子節點[mid+1,r],編號p*2+1

t[p]

.dat =

max(t[p*2]

.dat, t[p*2+

1].dat)

;// 從下往上傳遞資訊

}build(1

,1, n)

;// 呼叫入口

void

change

(int p,

int x,

int v)

// 找到葉節點

int mid =

(t[p]

.l + t[p]

.r)/2;

if(x <= mid)

change

(p*2

, x, v)

;// x屬於左半區間

else

change

(p*2+1

, x, v)

;// x屬於右半區間

t[p]

.dat =

max(t[p*2]

.dat, t[p*2+

1].dat)

;// 從下往上更新資訊

}change(1

, x, v)

;// 呼叫入口

intask

(int p,

int l,

int r)

cout <<

ask(

1, l, r)

<< endl;

// 呼叫入口

// 動態開點的線段樹

struct segmenttree tr[size *2]

;int root, tot;

intbuild()

// 在main函式中

tot =0;

root =

build()

;// 根節點

// 單點修改,在val位置加delta,維護區間最大值

void

insert

(int p,

int l,

int r,

int val,

int delta)

int mid =

(l + r)

>>1;

// 代表的區間[l,r]作為遞迴引數傳遞

if(val <= mid)

else

tr[p]

.dat =

max(tr[tr[p]

.lc]

.dat, tr[tr[p]

.rc]

.dat);}

// 呼叫

insert

(root,

1, n, val, delta)

;// 合併兩棵線段樹

intmerge

(int p,

int q,

int l,

int r)

int mid =

(l + r)

>>1;

tr[p]

.lc =

merge

(tr[p]

.lc, tr[q]

.lc, l, mid)

;// 遞迴合併左子樹

tr[p]

.rc =

merge

(tr[p]

.rc, tr[q]

.rc, mid +

1, r)

;// 遞迴合併右子樹

tr[p]

.dat =

max(tr[tr[p]

.lc]

.dat, tr[tr[p]

.rc]

.dat)

;// 更新最值

return p;

// 以p為合併後的節點,相當於刪除q

}

演算法競賽高階指南線性DP LCIS

發現水題好像不太會。得補下基礎了 這題要聯想到lis是以乙個數字為結尾最長的狀態,再聯想到lcs時以s串的前i個字母和t串的前j個字母的最大公共子串行的狀態。於是設出f i j 表示a的前i個數字和以b j 為結尾的最長上公升的長度,那麼就很好轉移了,如果a i b j 那麼f i j max f ...

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...

《演算法競賽高階指南》蚯蚓

蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓,第 i 只蚯蚓的長度為 ai 所有蚯蚓的長度都是非負整數,即可能存在長度為0的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...