社区讨论
10pts求调
P3372【模板】线段树 1参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lriy221k
- 此快照首次捕获于
- 2024/01/18 16:22 2 年前
- 此快照最后确认于
- 2024/01/18 19:45 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int M=500005;
int n,m;
int ls[M];
int ans;
struct nood
{
int l,r;
int mx;
int add;
int bj;
}tree[4*M+5];
int read()//
{
int x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*w;
}
void Pushdown(int k)//
{
if(tree[k].bj!=0)
{
tree[k*2].bj+=tree[k].bj;
tree[k*2+1].bj+=tree[k].bj;
tree[k*2].add+=(tree[k*2].r-tree[k*2].l+1)*tree[k].bj;
tree[k*2+1].add+=(tree[k*2+1].r-tree[k*2+1].l+1)*tree[k].bj;
tree[k].bj=0;
}
}
void build(int x,int y,int k)
{
tree[k].l=x;
tree[k].r=y;
tree[k].add=0;
tree[k].bj=0;
if(x==y)
{
tree[k].add=ls[x];
return;
}
int mid=(x+y)/2;
build(x,mid,2*k);
build(mid+1,y,2*k+1);
tree[k].add=tree[k*2].add+tree[k*2+1].add;
}
void ask(int k,int l,int r)
{
if(r<tree[k].l||l>tree[k].r)
{
return;
}
if(tree[k].bj!=0)
{
// cout<<"Ok"<<endl;
Pushdown(k);
}
if(l<=tree[k].l&&r>=tree[k].r)
{
ans+=tree[k].add;
// cout<<k<<" "<<tree[k].add;
return;
}
ask(2*k,l,r);
ask(2*k+1,l,r);
}
void add(int k,int a,int b,int d)
{
if(b<tree[k].l||a>tree[k].r)
{
return;
}
if(tree[k].bj!=0)
{
tree[k].bj+=d;
return;
}
if(a<=tree[k].l&&b>=tree[k].r)
{
tree[k].bj=d;
tree[k].add=tree[k].add+(tree[k].r-tree[k].l+1)*d;
return;
}
Pushdown(k);
add(2*k,a,b,d);
add(2*k+1,a,b,d);
tree[k].add=tree[k*2].add+tree[k*2+1].add;
}
int main()
{
n=read();
m=read();
for(int i=1;i<=n;i++)
{
cin>>ls[i];
}
build(1,n,1);
int www;
// while(cin>>www)
// {
// cout<<tree[www].l<<" "<<tree[www].r<<" "<<tree[www].add<<endl;
// }
for(int i=1;i<=m;i++)
{
int T;
int a,b;
T=read();
if(T==2)
{
a=read();
b=read();
ans=0;
ask(1,a,b);
cout<<ans<<endl;
}
else
{
a=read();
b=read();
int k;
k=read();
add(1,a,b,k);
}
}
return 0;
}
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/
回复
共 1 条回复,欢迎继续交流。
正在加载回复...