25分wa求解
查看原帖
25分wa求解
1122530
elpsconr楼主2024/4/11 02:15

wa求解,只过了第一个数据和样例

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+6;
ll nn,mm,a[N];
ll tree[N<<2],add[N<<2];
void lazy(ll rt,ll v,ll n)
{
    add[rt]+=v;tree[rt]+=(v*n);
}
void down(ll rt,ll l,ll r)
{
    if(add[rt]) 
    {
        lazy(rt<<1,add[rt],l);
        lazy(rt<<1|1,add[rt],r);
        add[rt]=0;
    }
}
void build(ll rt,ll l,ll r)
{
  if(l==r) 
  {
    tree[rt]=a[l];return;
  }
  ll m=l+r>>1;
  build(rt<<1,l,m);build(rt<<1|1,m+1,r);
  tree[rt]=tree[rt<<1]+tree[rt<<1|1];//up(rt)
  add[rt]=0;//建树
}
ll query(ll rt,ll l,ll r,ll x,ll y)
{
    if(l>y||r<x) return 0;
    if(l>=x&&r<=y) return tree[rt];
    ll ans=0;
    ll m=l+r>>1;
    down(rt,m-l+1,r-m);
    if(x<=m) ans+=query(rt<<1,l,m,x,y);
    if(y>m) ans+=query(rt<<1|1,m+1,r,x,y);
    return ans;
}
void change(ll rt,ll l,ll r,ll x,ll y,ll v)
{
    if(l>=x&r<=y) lazy(rt,v,r-l+1);
    else 
    {
        int m=l+r>>1;
        down(rt,m-1+1,r-m);
        if(x<=m) change(rt<<1,l,m,x,y,v);
        if(y>m) change(rt<<1|1,m+1,r,x,y,v);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    }
}
int main()
{
  cin>>nn>>mm;
  for(int i=1;i<=nn;++i) cin>>a[i];
  build(1,1,nn);
  while(mm--)
  {
    char ch;ll x,y,k;cin>>ch;
    if(ch=='1')
    {
      cin>>x>>y>>k;
      change(1,1,nn,x,y,k);
    }
    else 
    {
        cin>>x>>y;
        cout<<query(1,1,nn,x,y)<<endl;
    }
  }
  return 0;
}
2024/4/11 02:15
加载中...