Just a Hook hdu1698 [线段树区间更新]

这是一道比较明显的线段树区间更新,但是写起来还是有点麻烦~

直接上模板

相关链接:

just a hook


#include 
#include 
#include 
#include 

using namespace std;
#define N 100005
int s[N<<2];
int a[N<<2];
void pushup(int rt)       //向上更新
{
    s[rt]=s[rt<<1]+s[rt<<1|1];
}
void down(int rt,int p)      //向下更新
{
    if(a[rt])
    {
        a[rt<<1]=a[rt];
        a[rt<<1|1]=a[rt];
        s[rt<<1]=a[rt]*(p-p/2);
        s[rt<<1|1]=a[rt]*(p/2);
        a[rt]=0;
    }
}
void build(int l,int r,int rt)
{
    a[rt]=0;
    if(l==r)
    s[rt]=1;
    else
    {
        int m=(l+r)/2;
        build(l,m,rt<<1);
        build(m+1,r,rt<<1|1);
        pushup(rt);
    }
}
void updata(int left,int right,int l,int r,int rt,int p)
{
    if(left<=l&&right>=r)
    {
        a[rt]=p;
        s[rt]=a[rt]*(r-l+1);
        return ;
    }
    else
    {
        down(rt,r-l+1);
        int m=(l+r)/2;
        if(left<=m)
        updata(left,right,l,m,rt<<1,p);
        if(right>m)
        updata(left,right,m+1,r,rt<<1|1,p);
        pushup(rt);
    }
}
int query(int left,int right,int l,int r,int rt)
{
    if(left<=l&&right>=r)
    {
        return s[rt];
    }
    down(rt,r-l+1);
    int ans=0;
    int m=(l+r)/2;
    if(left<=m)
    ans+=query(left,right,l,m,rt<<1);
    if(right>m)
    ans+=query(left,right,m+1,r,rt<<1|1);
    return ans;
}
int main()
{
    int  t,x,y,z,n,k,p=1;
    scanf("%d",&t);
    while(t--)
    {
        int ans=0;
        scanf("%d%d",&n,&k);
        build(1,n,1);
        for(int i=0;i


你可能感兴趣的:(线段树&树状数组)