线段树动态开点
//区间加,区间询问
//A Simple Problem with Integers
#include <bits/stdc++.h> #define int long long using namespace std; const int N=1e5+5; int n,m,x,y,v,now,cnt; int a[N],add[N*50],sum[N*50],lson[N*50],rson[N*50]; inline void pushdown(int k,int l,int r,int mid) { if (add[k]) { add[lson[k]]+=add[k]; sum[lson[k]]+=(mid-l+1)*add[k]; add[rson[k]]+=add[k]; sum[rson[k]]+=(r-(mid+1)+1)*add[k]; add[k]=0; } } void build(int k,int l,int r) { if (l==r) {sum[k]=a[l]; return;} if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; build(lson[k],l,mid); build(rson[k],mid+1,r); sum[k]=sum[lson[k]]+sum[rson[k]]; } void change(int k,int l,int r,int qx,int qy,int v) { if (qx<=l && r<=qy) { add[k]+=v; sum[k]+=(r-l+1)*v; return; } if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); if (qx<=mid) change(lson[k],l,mid,qx,qy,v); if (mid<qy) change(rson[k],mid+1,r,qx,qy,v); sum[k]=sum[lson[k]]+sum[rson[k]]; } int query(int k,int l,int r,int qx,int qy) { if (qx<=l && r<=qy) return sum[k]; if (!lson[k]) lson[k]=++cnt; if (!rson[k]) rson[k]=++cnt; int mid=l+r>>1; pushdown(k,l,r,mid); int ans=0; if (qx<=mid) ans+=query(lson[k],l,mid,qx,qy); if (mid<y) ans+=query(rson[k],mid+1,r,qx,qy); return ans; } signed main(){ scanf("%lld%lld",&n,&m); cnt=1; for (register int i=1; i<=n; ++i) scanf("%lld",&a[i]); build(1,1,n); for (register int i=1; i<=m; ++i) { char kk; cin>>kk; // scanf("%lld",&now); if (kk=='C') { scanf("%lld%lld%lld",&x,&y,&v); change(1,1,n,x,y,v); } else { scanf("%lld%lld",&x,&y); printf("%lld\n",query(1,1,n,x,y)); } } return 0; }
//zz https://blog.csdn.net/u012972031/article/details/88751811
//https://www.luogu.org/problemnew/show/P3372
#include<cstdio>
#include<iostream>
using namespace std;
const int N=300010;
struct node{
int ls,rs,lazy;
long long sum;
}tr[N];
int root=0,cnt=0;
void insert(int &root,int l,int r,int ll,int rr,int x)
{
if(!root)
root=++cnt;
int b=min(r,rr)-max(l,ll)+1;
tr[root].sum+=b*x;
if(l>=ll&&r<=rr)
{
tr[root].lazy+=x;
return;
}
int mid=l+r>>1;
if(ll<=mid)
insert(tr[root].ls,l,mid,ll,rr,x);
if(rr>mid)
insert(tr[root].rs,mid+1,r,ll,rr,x);
}
long long query(int root,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)
return tr[root].sum;
int mid=l+r>>1;
if(tr[root].lazy)
{
if(!tr[root].ls)
tr[root].ls=++cnt;
tr[tr[root].ls].lazy+=tr[root].lazy;
tr[tr[root].ls].sum+=tr[root].lazy*(mid-l+1);
if(!tr[root].rs)
tr[root].rs=++cnt;
tr[tr[root].rs].lazy+=tr[root].lazy;
tr[tr[root].rs].sum+=tr[root].lazy*(r-mid);
tr[root].lazy=0;
}
long long ans=0;
if(ll<=mid)
ans+=query(tr[root].ls,l,mid,ll,rr);
if(rr>mid)
ans+=query(tr[root].rs,mid+1,r,ll,rr);
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int temp;
cin>>temp;
insert(root,1,n,i,i,temp);
}
for(int i=1;i<=m;i++)
{
int ta,tb,tc,td;
cin>>ta>>tb>>tc;
if(ta==1)
{
cin>>td;
insert(root,1,n,tb,tc,td);
}
else
if(ta==2)
{
cout<<query(root,1,n,tb,tc)<<endl;
}
}
return 0;
}
//区间赋值,区间询问
//https://www.luogu.com.cn/problem/CF915E
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,q,cnt,l,r,v;
int sum[N*50],tag[N*50],lson[N*50],rson[N*50];
inline void pushdown(int k,int l,int r,int mid)
{
if (~tag[k])
{
sum[lson[k]]=(mid-l+1)*tag[k];
sum[rson[k]]=(r-(mid+1)+1)*tag[k];
tag[lson[k]]=tag[rson[k]]=tag[k];
tag[k]=-1;
}
}
void change(int k,int l,int r,int qx,int qy,int v)
{
if (qx<=l && r<=qy)
{
tag[k]=v;
sum[k]=(r-l+1)*v;
return;
}
if (!lson[k]) lson[k]=++cnt;
if (!rson[k]) rson[k]=++cnt;
int mid=l+r>>1;
pushdown(k,l,r,mid);
if (qx<=mid) change(lson[k],l,mid,qx,qy,v);
if (mid<qy) change(rson[k],mid+1,r,qx,qy,v);
sum[k]=sum[lson[k]]+sum[rson[k]];
}
int main(){
memset(tag,-1,sizeof(tag));
scanf("%d",&n);
scanf("%d",&q);
cnt=1;
while (q--)
{
scanf("%d%d%d",&l,&r,&v);
v&=1;
if (l>r) swap(l,r);
change(1,1,n,l,r,v);
printf("%d\n",n-sum[1]);
}
return 0;
}
//https://blog.csdn.net/Dove_xyh/article/details/103019813

浙公网安备 33010602011771号