区间求最值
线段树模板1(51nod 1174)
const int maxn = 10005;
int line[maxn],tree[maxn<<2];
void pushup(int i){
tree[i]=max(tree[i<<1],tree[i<<1|1]);
}
void build(int i,int l,int r)
{
if(l==r){
tree[i]=line[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build((i<<1)+1,mid+1,r);
pushup(i);
}
int query(int l,int r,int L,int R,int i){
if(L>=l&&R<=r)
return tree[i];
int mid=(L+R)>>1;
int maxm=0;
if(mid>=l)
maxm=max(maxm,query(l,r,L,mid,i<<1));
if(mid+1<=r)
maxm=max(maxm,query(l,r,mid+1,R,(i<<1)+1));
return maxm;
}
int main()
{
int n,q;cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&line[i]);
build(1,1,n);
scanf("%d",&q);
while (q--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",query(l+1,r+1,1,n,1));
}
return 0;
}
模板2(poj 3264)
const int maxn = 1e5+5;
const int Maxn=1<<19;
struct Node{
int val,MIN;
int l,r;
}node[Maxn];
int fa[maxn];
void BuildTree(int i,int l,int r)
{
node[i].l=l;node[i].r=r;node[i].val=0,node[i].MIN=INF;
if(l==r){
fa[l]=i;
return;
}
int mid=(l+r)>>1;
BuildTree(i<<1,l,mid);
BuildTree((i<<1)+1,mid+1,r);
}
void UpdateTree(int ri)
{
if(ri==1)return;
int fi=ri>>1;
int a=node[fi<<1].val;
int aa=node[fi<<1].MIN;
int b=node[(fi<<1)+1].val;
int bb=node[(fi<<1)+1].MIN;
node[fi].val=max(a,b);
node[fi].MIN=min(aa,bb);
UpdateTree(ri>>1);
}
int MAX,MIN;
void Query(int i,int l,int r)
{
if(node[i].l==l&&node[i].r==r){
MAX=max(MAX,node[i].val);
MIN=min(MIN,node[i].MIN);
return;
}
int mid=(node[i].l+node[i].r)>>1;
if(r<=mid) Query(i<<1,l,r);
else if(l>mid) Query(i<<1|1,l,r);
else{
Query(i<<1,l,mid);
Query(i<<1|1,mid+1,r);
}
}
int main()
{
int n,q;scanf("%d%d",&n,&q);
BuildTree(1,1,n);
for(int i=1,g;i<=n;i++){
scanf("%d",&g);
node[fa[i]].val=g;
node[fa[i]].MIN=g;
UpdateTree(fa[i]);
}
while (q--){
int l,r;
scanf("%d%d",&l,&r);
MAX=0;MIN=INF;
Query(1,l,r);
printf("%d\n",MAX-MIN);
}
return 0;
}
RMQ模板(51nod 1174)
const int maxn = 1e6+5;
const int Maxn=1<<19;
const int mod=1e9+7;
int line[maxn][22];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
void RMQ(int n)
{
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<(j-1))<=n;i++)
line[i][j]=max(line[i][j-1],line[i+(1<<(j-1))][j-1]);
}
int main()
{
int n=read();
for(int i=1;i<=n;i++)
line[i][0]=read();
RMQ(n);
int m=read();
while (m--){
int l=read();int r=read();
l++,r++;
int k=log2(r-l+1);
int ans=max(line[l][k],line[r-(1<<k)+1][k]);
printf("%d\n",ans);
}
return 0;
}
区间单点更新
hdu 1166 敌兵布阵
线段树模板
const int maxn = 1e5+5;
const int Maxn=1<<19;
struct NODE{
int val,l,r;
}node[Maxn];
int fa[maxn];
void BuildTree(int i,int l,int r)
{
node[i].l=l,node[i].r=r,node[i].val=0;
if(l==r){
fa[l]=i;
return;
}
int mid=(l+r)>>1;
BuildTree(i<<1,l,mid);
BuildTree(i<<1|1,mid+1,r);
}
void UpdateTree(int ri)
{
if(ri==1)return;
int fi=ri>>1;
int a=node[fi<<1].val;
int b=node[fi<<1|1].val;
node[fi].val=a+b;
UpdateTree(ri>>1);
}
int res;
void Query(int i,int l,int r)
{
if(node[i].l==l&&node[i].r==r){
res+=node[i].val;
return;
}
i=i<<1;
if(l<=node[i].r){
if(r<=node[i].r) Query(i,l,r);
else Query(i,l,node[i].r);
}
i++;
if(r>=node[i].l){
if(l>=node[i].l) Query(i,l,r);
else Query(i,node[i].l,r);
}
}
int main()
{
int t,cas=0,n;
scanf("%d",&t);
while (t--){
cas++;
scanf("%d",&n);
BuildTree(1,1,n);
for(int i=1,g;i<=n;i++){
scanf("%d",&g);
node[fa[i]].val=g;
UpdateTree(fa[i]);
}
printf("Case %d:\n",cas);
while (1){
char world[10];
int a,b;
scanf("%s",world);
if(world[0]=='E')break;
scanf("%d%d",&a,&b);
if(world[0]=='A'){
node[fa[a]].val+=b;
UpdateTree(fa[a]);
}
if(world[0]=='S'){
node[fa[a]].val-=b;
UpdateTree(fa[a]);
}
if(world[0]=='Q'){
res=0;
Query(1,a,b);
printf("%d\n",res);
}
}
}
return 0;
}
线段树模板
const int maxn = 5e4+5;
const int Maxn=1<<19;
inline int lowbit(int x){return x&-x;}
int tree[maxn];
int n;
int query(int r){
int res=0;
while (r)res+=tree[r],r-=lowbit(r);
return res;
}
void update(int x,int y){
while (x<=n)tree[x]+=y,x+=lowbit(x);
}
int main()
{
int t,cas=0;
scanf("%d",&t);
while (t--){
cas++;
memset(tree,0,sizeof(tree));
scanf("%d",&n);
for(int i=1,val;i<=n;i++){
scanf("%d",&val);
update(i,val);
}
char com[20];
printf("Case %d:\n",cas);
while (~scanf("%s",com)&&com[0]!='E'){
int a,b;
scanf("%d%d",&a,&b);
if(com[0]=='A'){
update(a,b);
}
else if(com[0]=='S'){
update(a,-b);
}
else{
printf("%d\n",query(b)-query(a-1));
}
}
}
}
区间更新
线段树模板
typedef long long ll;
const int maxn = 1e5+5;
const int Maxn=1<<19;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
ll sum[maxn<<2],add[maxn<<2],a[maxn];
struct Node{
int l,r;
int mid(){
return (l+r)>>1;
}
}tree[maxn<<2];
void Pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Pushdown(int rt,int m){
if(add[rt]){
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
sum[rt<<1]+=add[rt]*(m-(m>>1));
sum[rt<<1|1]+=add[rt]*(m>>1);
add[rt]=0;
}
}
int k=1;
void Buildtree(int l,int r,int rt)
{
tree[rt].l=l;
tree[rt].r=r;
add[rt]=0;
if(l==r){
sum[rt]=a[k++];
return;
}
int m=tree[rt].mid();
Buildtree(lson);
Buildtree(rson);
Pushup(rt);
}
void Updatetree(int c,int l,int r,int rt)
{
if(tree[rt].l==l&&tree[rt].r==r){
add[rt]+=c;
sum[rt]+=(ll)c*(r-l+1);
return;
}
if(tree[rt].l==tree[rt].r) return;
Pushdown(rt,tree[rt].r-tree[rt].l+1);
int m=tree[rt].mid();
if(r<=m) Updatetree(c,l,r,rt<<1);
else if(l>m) Updatetree(c,l,r,rt<<1|1);
else{
Updatetree(c,l,m,rt<<1);
Updatetree(c,m+1,r,rt<<1|1);
}
Pushup(rt);
}
ll Query(int l,int r,int rt)
{
if(tree[rt].l==l&&tree[rt].r==r) return sum[rt];
Pushdown(rt,tree[rt].r-tree[rt].l+1);
int m=tree[rt].mid();
ll res=0;
if(r<=m) res+=Query(l,r,rt<<1);
else if(l>m) res+=Query(l,r,rt<<1|1);
else{
res+=Query(l,m,rt<<1);
res+=Query(m+1,r,rt<<1|1);
}
return res;
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
Buildtree(1,n,1);
while (m--){
char ch[2];
scanf("%s",ch);
int a,b,c;
if(ch[0]=='Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",Query(a,b,1));
}
}
}
return 0;
}