與上篇線段樹一起食用效果更佳:神奇線段樹(點選收穫幸福)
一開始當然是暴力!(會超時的否掉)不用暴力的話。。就用
(結合**了解吧。。我不想畫圖。。。)
先建樹
//建樹 void build_tree(int x,int y,int
p)
int mid=(x+y)/2
; build_tree(x,mid,p*2
); build_tree(mid+1,y,p*2+1
); tree[p].maxx=max(tree[p*2].maxx,tree[p*2+1].maxx);//
求最大值
}
區間修改
//區間修改
void putdown(int
p)void changeplus(int x,int y,int p,int
v)
int mid=(tree[p].a+tree[p].b)/2
;
if(y<=tree[p*2
].b)
changeplus(x,mid,p*2
,v);
if(x>=tree[p*2+1
].a)
changeplus(mid+1,y,p*2+1
,v);
tree[p].maxx=max(tree[p*2].maxx,tree[p*2+1].maxx);//
簡單二分
}
void changeplus(int x,int y,int p,intv)
if(tree[p].lazy)
}
查詢區間最大值
//查詢最大值
int ask(int x,int y,int
p)
看道題吧(點選收穫rp++)
冥想ing。。。
ac**:
(調了兩天。。終於。。)
#include#includeusing
namespace
std;
struct
nodetree[
4000004
];int a[500005
];long
long
intans;
//建樹
void build_tree(int x,int y,int
p)
int mid=(x+y)/2
; build_tree(x,mid,p*2
); build_tree(mid+1,y,p*2+1
); tree[p].maxx=tree[p*2].maxx+tree[p*2+1
].maxx;
} //
區間修改
void putdown(int
p)void changeplus(int x,int y,int p,int
v)
if(tree[p].lazy)
putdown(p);
//遇到標記就下放
int mid=(tree[p].a+tree[p].b)/2
;
if(x<=mid&&y>=tree[p*2].a )changeplus(x,y,p*2
,v);
if(y>mid&&x<=tree[p*2+1].b)changeplus(x,y,p*2+1
,v);
tree[p].maxx=tree[p*2].maxx+tree[p*2+1
].maxx;
} void ask(int x,int y,int
p)
if(y<=tree[p*2
].b)
ask(x,y,p*2
);
if(x>=tree[p*2+1
].a)
ask(x,y,p*2+1);}
intmain()
build_tree(
1,n,1
);
for(int i=1;i<=m;i++)
else
}return0;
}
(rp++!!)
線段樹區間修改模板
本來打算把大白書第三章一口氣攻下來的,但是這個線段樹也是卡了好久。不敢過題太快,怕自己走馬觀花到頭來結果什麼都不會。可也不能再拖了,在做題中也許有更多的體會。模板一 1 l r v 表示區間 l,r 所有元素都加上v 2 l r 表示查詢區間 l,r 的sum,min,max sumv o 的定義為...
模板 線段樹(區間修改)
1 include 2 include 3 include 4 include 5 include 6 using namespace std 7const int maxn 100000 10 8 9 update a dd 把a l a r 的值全部加v add 10 update s et 把...
線段樹 區間求和模板 (區間修改)
include include include include include include include include include define mem a memset a,0,sizeof a define mem2 a memset a,1,sizeof a define mod ...