POJ 3468 求助!
  • 板块学术版
  • 楼主lijunxi_luqiao
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/12 22:14
  • 上次更新2024/8/13 08:30:24
查看原帖
POJ 3468 求助!
1006406
lijunxi_luqiao楼主2024/8/12 22:14

本人蒟蒻
![题面]("C:\Users\pc\Pictures\Screenshots\屏幕截图 2024-08-12 221121.png")
不知为何,POJ这题无论如何都没法过,我的代码如下:

#include<iostream>
using namespace std;
long long n,m,a[100005],sum[400005],add[400005];
void pushup(long long rt)
{
    sum[rt]=sum[rt<<1|1]+sum[rt<<1];
}
void pushdown(long long rt,long long len)
{
    if(add[rt])
    {
        sum[rt<<1]+=add[rt]*(len+1>>1),sum[rt<<1|1]+=add[rt]*(len>>1),
        add[rt<<1]=add[rt<<1|1]=add[rt];add[rt]=0;
    }
}
void build(long long l,long long r,long long rt)
{
    if(l==r)
    {
        sum[rt]=a[l];
        return ;
    }
    long long mid=l+r>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    pushup(rt);
}
void update(long long ul,long long ur,long long ad,long long l,long long r,long long rt)
{
    if(ul<=l&&ur>=r)
    {
        sum[rt]+=ad*(r-l+1);
        add[rt]+=ad;
        return ;
    }
    long long mid=l+r>>1;
    pushdown(rt,r-l+1);
    if(ul<=mid)
        update(ul,ur,ad,l,mid,rt<<1);
    if(ur>mid)
        update(ul,ur,ad,mid+1,r,rt<<1|1);
    pushup(rt);
}
long long query(long long ql,long long qr,long long l,long long r,long long rt)
{
    if(ql<=l&&qr>=r)
        return sum[rt];
    long long mid=l+r>>1,cnt=0;
    pushdown(rt,r-l+1);
    if(ql<=mid)
        cnt+=query(ql,qr,l,mid,rt<<1);
    if(qr>mid)
        cnt+=query(ql,qr,mid+1,r,rt<<1|1);
    return cnt;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(long long i=1;i<=n;i++)
        cin>>a[i];
    build(1,n,1);
    for(long long i=1;i<=m;i++)
    {
        char op;long long a,b,c;
        cin>>op>>a>>b;
        if(op=='C')
        {
            cin>>c;
            update(a,b,c,1,n,1);
        }
        if(op=='Q')
            cout<<query(a,b,1,n,1)<<'\n';
    }
    return 0;
}

望相助!

2024/8/12 22:14
加载中...