首页 > 代码库 > 怒刷30道线段树、树状数组

怒刷30道线段树、树状数组

HDU 1754 单点更新,区间查询最大值,水题……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 1000000
#define maxn 1000010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int Max[maxn],a[200005],n,m,i;
void pushup(int i)
{
    Max[i]=max(Max[i<<1],Max[i<<1|1]);
}
void build(int i,int l,int r)
{
    if(l==r)
    {
        Max[i]=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(lson);build(rson);
    pushup(i);
}
void update(int i,int l,int r,int x,int v)
{
    if(l==r&&l==x)
    {
        Max[i]=v;
        return ;
    }
    int mid=(l+r)>>1;
    if(x<=mid) update(lson,x,v);
    else update(rson,x,v);
    pushup(i);
}
int query(int i,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return Max[i];
    int mid=(l+r)>>1,ans=0;
    if(L<=mid) ans=max(ans,query(lson,L,R));
    if(R>mid) ans=max(ans,query(rson,L,R));
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1;i<=n;i++)
            scanf("%d",a+i);
        build(1,1,n);
        int x,y;
        char str[3];
        while(m--)
        {
            scanf("%s%d%d",str,&x,&y);
            if(str[0]=='Q')
                printf("%d\n",query(1,1,n,x,y));
            else update(1,1,n,x,y);
        }
    }
    return 0;
}

HDU 1698 区间更新,区间查询,lazy标记种类,水……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 1000000
#define maxn 400010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int sum[maxn],lazy[maxn],n,q;
void pushup(int i)
{
    sum[i]=sum[i<<1]+sum[i<<1|1];
}
void pushdown(int i,int l,int r)
{
    if(lazy[i])
    {
        int mid=(l+r)>>1;
        lazy[i<<1]=lazy[i<<1|1]=lazy[i];
        sum[i<<1]=(mid-l+1)*lazy[i<<1];
        sum[i<<1|1]=(r-mid)*lazy[i<<1|1];
        lazy[i]=0;
    }
}
void update(int i,int l,int r,int L,int R,int v)
{
    if(l==L&&r==R)
    {
        sum[i]=(r-l+1)*v;
        lazy[i]=v;
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(i,l,r);
    if(R<=mid) update(lson,L,R,v);
    else if(L>mid) update(rson,L,R,v);
    else
    {
        update(lson,L,mid,v);
        update(rson,mid+1,R,v);
    }
    pushup(i);
}
void build(int i,int l,int r)
{
    if(l==r)
    {
        sum[i]=1;
        lazy[i]=1;
        return ;
    }
    sum[i]=lazy[i]=0;
    int mid=(l+r)>>1;
    build(lson);build(rson);
    pushup(i);
}
int main()
{
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        scanf("%d%d",&n,&q);
        build(1,1,n);
        int l,r,v;
        while(q--)
        {
            scanf("%d%d%d",&l,&r,&v);
            update(1,1,n,l,r,v);
        }
        printf("Case %d: The total value of the hook is %d.\n",i,sum[1]);
    }
    return 0;
}