线段树求调
  • 板块学术版
  • 楼主jwhou
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/12/25 20:21
  • 上次更新2024/12/26 12:22:12
查看原帖
线段树求调
366297
jwhou楼主2024/12/25 20:21

区间修改+查询

#include<bits/stdc++.h>
using namespace std;
void build(int x,int l,int r);
void add(int p,int l,int r);
int ask(int p,int l,int r);

const int N=1e5+2;
int n,m,op,x,y,k,a[N],s[4*N],t[4*N];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,1,n);
    while(m--)
    {
        cin>>op>>x>>y;
        if(op==1)
        {
            cin>>k;
            add(1,1,n);
        }
        else
            cout<<ask(1,1,n)<<"\n";
    }
    return 0;
}
void build(int x,int l,int r)
{
    if(l==r)
    {
        s[x]=a[l];
        return;
    }
    build(x*2,l,l+r>>1);
    build(x*2+1,(l+r>>1)+1,r);
    s[x]=s[x*2]+s[x*2+1];
}
void add(int p,int l,int r)
{
    if(r<x||l>y)
        return;
    s[p]+=k*(min(r,y)-max(l,x)+1);
    if(l>=x&&r<=y)
    {
        t[p]+=k;
        return;
    }
    add(p*2,l,l+r>>1);
    add(p*2+1,(l+r>>1)+1,r);
}
int ask(int p,int l,int r)
{
    if(r<x||l>y)
        return 0;
    if(l>=x&&r<=y)
        return s[p];
    t[p*2]+=t[p];
    t[p*2+1]+=t[p];
    s[p*2]+=t[p]*((l+r>>1)+2-l);
    s[p*2+1]+=t[p]*(r-(l+r>>1));
    t[p]=0;
    return ask(p*2,l,l+r>>1)+ask(p*2+1,(l+r>>1)+1,r);
}
2024/12/25 20:21
加载中...