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的蚯蚓。每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻,將其切成兩段。若有多隻最長的,則任...