MC_OIer @ 2024-05-04 11:56:33
#include<bits/stdc++.h>
using namespace std;
struct node{
long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans;
node rt[400005];
void push_down(long long now){
rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);
rt[now*2].p=rt[now].p;
rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);
rt[now*2+1].p=rt[now].p;
rt[now].p=0;
}
void build(long long l,long long r,long long now){
rt[now].s=l;
rt[now].t=r;
rt[now].p=0;
if(l==r){
rt[now].v=a[l];
return;
}
long long m=(l+r)/2;
build(l,m,now*2);
build(m+1,r,now*2+1);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
if(rt[now].s>=l&&rt[now].t<=r){
rt[now].v+=k*(rt[now].t-rt[now].s+1);
rt[now].p+=k;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
modify(l,r,now*2,k);
modify(l,r,now*2+1,k);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
if(rt[now].s>=l&&rt[now].t<=r){
ans+=rt[now].v;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
query(l,r,now*2);
query(l,r,now*2+1);
}
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++){
long long op,l,r,k;
ans=0;
cin>>op>>l>>r;
if(op==2){
query(l,r,1);
cout<<ans<<endl;
}
else{
cin>>k;
modify(l,r,1,k);
}
}
return 0;
}
错的地方全比正解少一,加一完输出全wa
by do_it_tomorrow @ 2024-05-04 21:31:12
#include<bits/stdc++.h>
using namespace std;
struct node{
long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans;
node rt[400005];
void push_down(long long now){
rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);//here
rt[now*2].p=rt[now].p;
rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);//here
rt[now*2+1].p=rt[now].p;
rt[now].p=0;
}
void build(long long l,long long r,long long now){
rt[now].s=l;
rt[now].t=r;
rt[now].p=0;
if(l==r){
rt[now].v=a[l];
return;
}
long long m=(l+r)/2;
build(l,m,now*2);
build(m+1,r,now*2+1);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
if(rt[now].s>=l&&rt[now].t<=r){
rt[now].v+=k*(rt[now].t-rt[now].s+1);
rt[now].p+=k;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
modify(l,r,now*2,k);
modify(l,r,now*2+1,k);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
if(rt[now].s>=l&&rt[now].t<=r){
ans+=rt[now].v;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
query(l,r,now*2);
query(l,r,now*2+1);
}
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++){
long long op,l,r,k;
ans=0;
cin>>op>>l>>r;
if(op==2){
query(l,r,1);
cout<<ans<<endl;
}
else{
cin>>k;
modify(l,r,1,k);
}
}
return 0;
}
by do_it_tomorrow @ 2024-05-04 21:31:57
不,发错了,在 here 的下面。
#include<bits/stdc++.h>
using namespace std;
struct node{
long long s,t,v,p;//s->start,t->end,v->value,p->lazy_tag
};
long long n,m,a[100005],ans;
node rt[400005];
void push_down(long long now){
rt[now*2].v+=rt[now].p*(rt[now*2].t-rt[now*2].s+1);
rt[now*2].p+=rt[now].p;
rt[now*2+1].v+=rt[now].p*(rt[now*2+1].t-rt[now*2+1].s+1);
rt[now*2+1].p+=rt[now].p;
rt[now].p=0;
}
void build(long long l,long long r,long long now){
rt[now].s=l;
rt[now].t=r;
rt[now].p=0;
if(l==r){
rt[now].v=a[l];
return;
}
long long m=(l+r)/2;
build(l,m,now*2);
build(m+1,r,now*2+1);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void modify(long long l,long long r,long long now,long long k){
if(rt[now].s>=l&&rt[now].t<=r){
rt[now].v+=k*(rt[now].t-rt[now].s+1);
rt[now].p+=k;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
modify(l,r,now*2,k);
modify(l,r,now*2+1,k);
rt[now].v=rt[now*2].v+rt[now*2+1].v;
}
void query(long long l,long long r,long long now){
if(rt[now].s>=l&&rt[now].t<=r){
ans+=rt[now].v;
return;
}
if(rt[now].t<l||rt[now].s>r)return;
if(rt[now].p)push_down(now);
query(l,r,now*2);
query(l,r,now*2+1);
}
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++){
long long op,l,r,k;
ans=0;
cin>>op>>l>>r;
if(op==2){
query(l,r,1);
cout<<ans<<endl;
}
else{
cin>>k;
modify(l,r,1,k);
}
}
return 0;
}
by MC_OIer @ 2024-05-08 21:08:44
@do_it_tomorrow 已关,感谢CCCCOrz
by MC_OIer @ 2024-05-08 22:42:19
@do_it_tomorrow 可是为什么我没看出来改了哪里???请大神注明一下呗qwq……orz
by MC_OIer @ 2024-05-08 22:46:04
@do_it_tomorrow 为什么push_down中要用=而不能用+=呢?儿子节点之前有标记怎么办呢
by MC_OIer @ 2024-05-08 22:47:46
oh,sorry我把WA的代码和AC代码看反了(我真是个智障)
by MC_OIer @ 2024-05-08 22:51:22
好的,此帖结