原題:
題意:
每次查詢,求給定區間的最大子串。
解析:
維護區間和sum
sumsu
m,區間最大串max
maxma
x,從區間左端點開始往右的最大串lma
xlmax
lmax
,從區間右端點開始往左的最大串rma
xrmax
rmax
。考慮更新max
_r
tmax\_rt
max_rt
,兩個兒子都有一段的情況為:rma
x_ls
+lma
x_rs
rmax\_ls+lmax\_rs
rmax_l
s+lm
ax_r
s,否則就是max
_l
smax\_ls
max_ls
和m ax
_r
smax\_rs
max_rs
其中的乙個
考慮更新lma
x_rt
lmax\_rt
lmax_r
t,顯然從左往右延伸,沒有超過中點時為lma
x_ls
lmax\_ls
lmax_l
s,超過中點時為sum
_ls+
lmax
_r
ssum\_ls+lmax\_rs
sum_ls
+lma
x_rs
r ma
xrmax
rmax
同l ma
x_rt
lmax\_rt
lmax_r
t**:
#include
using
namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
const
int maxn=
2e5+9;
int n;
ll array[maxn]
;struct node tr[maxn<<2]
;void
pushup
(node &ans,node lef,node rig)
void
build
(int rt=1,
int l=1,
int r=n)
build
(ls,l,mid)
;build
(rs,mid+
1,r)
;pushup
(tr[rt]
,tr[ls]
,tr[rs]);
}void
update
(int pos,ll val,
int rt=1,
int l=1,
int r=n)
if(pos<=mid)
update
(pos,val,ls,l,mid)
;else
update
(pos,val,rs,mid+
1,r)
;pushup
(tr[rt]
,tr[ls]
,tr[rs]);
}node query
(int l,
int r,
int rt=1,
int l=1,
int r=n)
if(r<=mid)
return
query
(l,r,ls,l,mid);if
(l>mid)
return
query
(l,r,rs,mid+
1,r)
; node ans,lef=
query
(l,r,ls,l,mid)
,rig=
query
(l,r,rs,mid+
1,r)
;pushup
(ans,lef,rig)
;return ans;
}int
main()
build()
;int _;
for(
scanf
("%d"
,&_)
; _--;)
}
動態規劃 最大子串 HDOJ1003
題目大意 輸入是具有n個整數的向量x,輸出是輸入向量的任何聯絡子向量中的最大和,並輸出該子向量的開始和結束為止。例如 輸入 5 6 1 5 4 7 7 0 6 1 1 6 7 5 輸出 case 1 14 1 4 case 2 7 1 6 分別有四種方法都能夠求解出來分別是o n 3 和o n 2 ...
最大子串乘積
最大子串乘積 輸入n個數,求它的最大的連續子串乘積。例 輸入 1 2 3 7 0 2 3 輸出 實現 include int max subsegment int arr int len 最大子段乘積函式 else if arr j 0 else return max int main main p...
最大子串演算法
最大子串問題是一類經典問題,即在一串整形陣列中選取和最大的子串 給出問題描述 對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。針對本問題,可有三種方法,一種是暴利破解列舉演算法,所有子串種類...