首页 > 其他 > 详细

线段树

时间:2020-01-18 21:52:30      阅读:74      评论:0      收藏:0      [点我收藏+]

技术分享图片

技术分享图片

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

技术分享图片

 技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

 

 

 技术分享图片

 

 

 技术分享图片

技术分享图片

 技术分享图片

 技术分享图片

技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片

 技术分享图片                                   技术分享图片

 技术分享图片

 技术分享图片

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
int n,m,a[N];
int mx[N*4],mn[N*4];
void pushup(int k)
{
    mx[k]=max(mx[k*2],mx[k*2+1]);
    mn[k]=min(mn[k*2],mn[k*2+1]);
}
void build(int k,int l,int r)
{
    if(l==r)
    {
        mx[k]=mn[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    pushup(k);
}
int ask_max(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return mx[k];
    int mid=l+r>>1;
    if(y<=mid) return ask_max(k*2,l,mid,z,y);
    if(z>mid) return ask_max(k*2+1,mid+1,r,z,y);
    return max(ask_max(k*2,l,mid,z,mid),
            ask_max(k*2+1,mid+1,r,mid+1,y));
}
int ask_min(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return mn[k];
    int mid=l+r>>1;
    if(y<=mid) return ask_min(k*2,l,mid,z,y);
    if(z>mid) return ask_min(k*2+1,mid+1,r,z,y);
    return min(ask_min(k*2,l,mid,z,mid),
            ask_min(k*2+1,mid+1,r,mid+1,y));
}
void change(int k,int l,int r,int x)
{
    if(l==r)
    {
        mx[k]=mn[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    if(x<=mid) change(k*2,l,mid,x);
    else change(k*2+1,mid+1,r,x);
    pushup(k);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        int ans=ask_max(1,1,n,l,r)-ask_min(1,1,n,l,r);
        cout<<ans<<endl;
    }
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
int n,m,a[N];
int sum[N*4],len[N*4],ad[N*4];
void pushup(int k)
{
    sum[k]=sum[k*2]+sum[k*2+1];
    len[k]=len[k*2]+len[k*2+1];
}
void A(int k,int x)
{
    sum[k]+=x*len[k];
    ad[k]+=x;
}
void pushdown(int k)
{
    A(k*2,ad[k]);
    A(k*2+1,ad[k]);
    ad[k]=0;
}
void build(int k,int l,int r)
{
    if(l==r)
    {
        sum[k]=a[l];
        len[k]=1;
        return;
    }
    int mid=l+r>>1;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    pushup(k);
}
int ask_sum(int k,int l,int r,int z,int y)
{
    if(l==z&&r==y) return sum[k];
    if(ad[k]) pushdown(k);
    int mid=l+r>>1;
    if(y<=mid) return ask_sum(k*2,l,mid,z,y);
    if(z>mid) return ask_sum(k*2+1,mid+1,r,z,y);
    return ask_sum(k*2,l,mid,z,mid)+
            ask_sum(k*2+1,mid+1,r,mid+1,y);
}
void change(int k,int l,int r,int z,int y,int x)
{
    if(l==z&&r==y)
    {
        A(k,x);
        return;
    }
    if(ad[k]) pushdown(k);
    int mid=l+r>>1;
    if(y<=mid) change(k*2,l,mid,z,y,x);
    else if(z>mid) change(k*2+1,mid+1,r,z,y,x);
    else
    {
        change(k*2,l,mid,z,mid,x);
        change(k*2+1,mid+1,r,mid+1,y,x);
    }
    pushup(k);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    cin>>m;
    while(m--)
    {
        int op,a,b,x;
        cin>>op>>a>>b;
        if(op==1)
        {
            cin>>x;
            change(1,1,n,a,b,x);
        }
        else
        {
            int ans=ask_sum(1,1,n,a,b);
            cout<<ans<<endl;
        }
    }
}

线段树

原文:https://www.cnblogs.com/liusu123456/p/12210158.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!