性!感!代!码!在!线!求!调!

P3372 【模板】线段树 1

nopic @ 2023-03-14 19:04:18

#include<bits/stdc++.h>
using namespace std;

int n,m;
int input[20000010];
int ans;

struct node {
    int l,r;
    int sum,maxx;
    int add;
} tree[20000010];

void build(int now,int l,int r) {
    tree[now].l=l;
    tree[now].r=r;
    if(l==r) {
        tree[now].add=input[l];
        tree[now].sum=input[l];
        return;
    }
    int mid=(l+r)>>1;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
}
void pushup(int now) {
    tree[now].sum=tree[now<<1].sum+tree[now<<1 | 1].sum;
}
void solve_node(int now,int v) {
    tree[now].add+=v;
    tree[now].sum+=v*(tree[now].r-tree[now].l+1);
}
void pushdown(int now) {
    if(tree[now].add==0)
        return;
    solve_node(now<<1,tree[now].add);
    solve_node(now<<1 | 1,tree[now].add);
    tree[now].add=0;
}
void modify(int now,int x,int y,int v) {
    if(x<=tree[now].l&&y>=tree[now].r) {
        solve_node(now,v);
        return;
    }
    int mid=(tree[now].r+tree[now].l)>>1;
    pushdown(now);
    if(x<=mid)
        modify(now<<1,x,y,v);
    if(y>mid)
        modify(now<<1 | 1,x,y,v);
    pushup(now);
}

int query(int now,int x,int y) {
    if(x<=tree[now].l&&y>=tree[now].r)
        return tree[now].sum;
    int mid=(tree[now].l+tree[now].r)>>1,s=0;
    pushdown(now);
    if(x<=mid)
        s+=query(now<<1,x,y);
    if(y>mid)
        s+=query(now<<1 | 1,x,y);
    return s;

}

int main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>input[i];
    build(1,1,n);
    for(int i=1; i<=m; i++) {
        int a,x,y,k;
        cin>>a;
        if(a==1) {
            cin>>x>>y>>k;
            modify(1,x,y,k);
        } else {
            cin>>x>>y;
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

样例全过!! 蒟蒻求教了


by simonG @ 2023-03-14 19:08:28

build 没有 pushup


by simonG @ 2023-03-14 19:08:45

@Ayaka_Kamari


by Custlo0793 @ 2023-03-14 19:08:56

@Ayaka_Kamari 我测,原友

窥镜而自视,又弗如元神


by nopic @ 2023-03-14 19:09:04

谢谢


by 北文 @ 2023-03-14 19:09:14

@Ayaka_Kamari 明明是我发现的,但是调了这个还没过


by 北文 @ 2023-03-14 19:10:02

没开longlong


by 北文 @ 2023-03-14 19:11:00

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int input[20000010];
int ans;

struct node {
    int l,r;
    int sum,maxx;
    int add;
} tree[20000010];
void pushup(int now) {
    tree[now].sum=tree[now<<1].sum+tree[now<<1 | 1].sum;
}
void build(int now,int l,int r) {
    tree[now].l=l;
    tree[now].r=r;
    if(l==r) {
        tree[now].add=input[l];
        tree[now].sum=input[l];
        return;
    }
    int mid=(l+r)>>1;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    pushup(now);
}

void solve_node(int now,int v) {
    tree[now].add+=v;
    tree[now].sum+=v*(tree[now].r-tree[now].l+1);
}
void pushdown(int now) {
    if(tree[now].add==0)
        return;
    solve_node(now<<1,tree[now].add);
    solve_node(now<<1 | 1,tree[now].add);
    tree[now].add=0;
}
void modify(int now,int x,int y,int v) {
    if(x<=tree[now].l&&y>=tree[now].r) {
        solve_node(now,v);
        return;
    }
    int mid=(tree[now].r+tree[now].l)>>1;
    pushdown(now);
    if(x<=mid)
        modify(now<<1,x,y,v);
    if(y>mid)
        modify(now<<1 | 1,x,y,v);
    pushup(now);
}

int query(int now,int x,int y) {
    if(x<=tree[now].l&&y>=tree[now].r)
        return tree[now].sum;
    int mid=(tree[now].l+tree[now].r)>>1,s=0;
    pushdown(now);
    if(x<=mid)
        s+=query(now<<1,x,y);
    if(y>mid)
        s+=query(now<<1 | 1,x,y);
    return s;

}

signed main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>input[i];
    build(1,1,n);
    for(int i=1; i<=m; i++) {
        int a,x,y,k;
        cin>>a;
        if(a==1) {
            cin>>x>>y>>k;
            modify(1,x,y,k);
        } else {
            cin>>x>>y;
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

by nopic @ 2023-03-14 19:11:16

ok ,马上就去逝,谢谢各位大佬


by peterwuyihong @ 2023-03-14 19:13:35

yuanshen怎么你了


by OPLeo @ 2023-03-14 19:33:12

你说的对 后面忘了


|