zsz0804_ @ 2024-11-07 20:28:14
大佬们,样例输出 8 5 4。
本人代码丑陋。
#include<bits/stdc++.h>
#define int long long
#define N 1000010
using namespace std;
int a[N],tree[4*N],tag[4*N],n,m,op,x,y,k;
int ls(int p){return p>>1;}
int rs(int p){return p>>1|1;}
void update(int p){
tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(int p,int pl,int pr){
if(pl==pr){
tree[p]=a[pl];
return;
}
int mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
}
void tagd(int pl,int pr,int p){
int mid=(pl+pr)>>1;
if(tag[p]>0){
tag[ls(p)]=tag[rs(p)]=tag[p];
tree[ls(p)]=(mid-pl+1)*tag[p];
tree[rs(p)]=(pr-mid)*tag[p];
tag[p]=0;
}
}
int que2(int l,int r,int pl,int pr,int p){
if(l<=pl&&pr<=r){
return tree[p];
}
tagd(pl,pr,p);
int mid=(pl+pr)>>1,ans=0;
if(l<=mid){
ans+=que2(l,r,pl,mid,ls(p));
}
if(mid<r){
ans+=que2(l,r,mid+1,pr,rs(p));
}
return ans;
}
void ch2(int i,int v,int pl,int pr,int p){
if(pl==pr){
tree[p]=v;
return;
}
tagd(pl,pr,p);
int mid=(pl+pr)>>1;
if(i<=mid){
ch2(i,v,pl,mid,ls(p));
}else{
ch2(i,v,mid+1,pr,rs(p));
}
update(p);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>op>>x>>y;
if(op==1){
cin>>k;
update(k);
}else{
cout<<que2(x,y,1,n,1)<<"\n";
}
}
return 0;
}
AC回关
by Mugino_Shizuri @ 2024-11-07 20:36:20
build 没 pushup
by Mugino_Shizuri @ 2024-11-07 20:37:07
ee,update,说错了。
by Mugino_Shizuri @ 2024-11-07 20:39:04
tagd 不能直接赋值。
by Mugino_Shizuri @ 2024-11-07 20:40:05
你这是在写什么?
by Mugino_Shizuri @ 2024-11-07 20:40:24
ch2 用过吗?
by Mugino_Shizuri @ 2024-11-07 20:40:47
ch2 也是错的,不能直接赋值。
by Mugino_Shizuri @ 2024-11-07 20:42:02
你在单点修改吗?