too short??

P3372 【模板】线段树 1

Chinami_Nagisa @ 2024-10-21 12:13:10

0pts

经测试,本地编译器输出正确,洛谷不开O2都输出0,开O2什么也不输出

蒟蒻在线求调~

#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int N=1e5+10;
int tree[N<<2];
int tag[N<<2];
int a[N];
int m,n;
int LS(int x) { return x<<1; }
int RS(int x) { return x<<1|1; }
void addtag(int p,int pl,int pr,int k)  //更新tag并更新区间和
{
    tag[p]+=k;
    tree[p]+=k*(pr-pl+1);
}
void push_up(int x)  //向上传递值
{
    tree[x]=tree[LS(x)]+tree[RS(x)];
} 
void push_down(int p,int pl,int pr) //节点p往下传tag
{
    if(tag[p]) //有才传
    {
        int mid=pl+pr>>1;
        addtag(LS(p),pl,mid,tag[p]);
        addtag(RS(p),mid+1,pr,tag[p]);
        tag[p]=0;  //清零
    }
}
void build(int l,int r,int i)  //区间断点+所在编号
{
    if(l==r)
    {
        tree[i]=a[l];   //注意下标别错了  
        return;
    }
    int mid=l+r>>1;
    build(l,mid,LS(i));
    build(mid+1,r,RS(i));
    push_up(i);
}
int query(int L,int R,int pl,int pr,int p)  //目标:L,R,当前:pl,pr
{
    if(L<=pl && pr<=R)  //当前区间[pl,pr]被目标区间完全覆盖
        return tree[p];
    //如果不是完全覆盖
    push_down(p,pl,pr);
    int res=0;
    int mid=pl+pr>>1;
    if(L<=mid) res+=query(L,R,pl,mid,LS(p));  //与左子树有重叠
    if(R>mid) res+=query(L,R,mid+1,pr,RS(p));  //与柚子树有重叠(
    return res;    //搞清到底是pl,pr还是L,R;L,R是全程不动的
}
void update(int L,int R,int pl,int pr,int p,int k)
{
    if(L<=pl && pr<=R)
    {
        addtag(p,pl,pr,k);
        return;
    }
    //不是完全覆盖覆盖
    push_down(p,pl,pr);  //传tag给子树用
    int mid=pl+pr>>1;
    if(L<=mid) update(L,R,pl,mid,LS(p),k);
    if(R>mid) update(L,R,mid+1,pr,RS(p),k);   //这两句同query
    push_up(p);
}
signed main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,n,1);
    int op,x,y,k;
    while(m--)
    {
        scanf("%d",&op);
        switch(op)
        {
            case 1:
            {
                scanf("%d%d%d",&x,&y,&k);
                update(x,y,1,n,1,k);
            }
            break;
            case 2:
            {
                scanf("%d%d",&x,&y);
                printf("%d\n",query(x,y,1,n,1));
            }
        }
    }
    return 0;
}

by crz_qwq @ 2024-10-21 12:24:32

scanf 里的 %d 改成 %lld


by crz_qwq @ 2024-10-21 12:24:42

@Chinami_Nagisa


by Chinami_Nagisa @ 2024-10-21 14:26:53

@crz_qwq 豪德


|