社区讨论
改不出来了,求助
P3372【模板】线段树 1参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo14lb0t
- 此快照首次捕获于
- 2023/10/22 15:06 2 年前
- 此快照最后确认于
- 2023/11/02 14:38 2 年前
C
#include<bits/stdc++.h>
#define N 9999999
using namespace std;
long long f[N],sum[N];
/*快读*/inline void read(long long &a)
{
int s=0,w=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';ch=getchar();
}
a=s*w;
}
/*单点修改*/void change(int l,int r,int k)
{
if(l==r)
{
read(f[k]);
return ;
}
int mid=(l+r)>>1;
change(l,mid,k*2);
change(mid+1,r,k*2+1);
f[k]=f[k*2]+f[k*2+1];
}
/*打标记*/void add(int l,int r,int v,int k)
{
f[k]=v;
sum[k]+=(r-l+1)*v;
return ;
}
/*标记下传*/void down(int l,int r,int k,int mid,int v)
{
if(f[k]==0)return ;
add(l,mid,v,k*2);
add(mid+1,r,v,k*2+1);
f[k]=0;
}
/*区间修改*/void xg(int x,int y,int l,int r,int k,int v)
{
if(x>=l&&r>=y)return add(l,r,v,k);
int mid=(l+r)>>1;
down(l,r,k,mid,v);
if(x<=mid)xg(x,y,l,mid,k*2,v);
if(mid<y)xg(x,y,mid+1,r,k*2+1,v);
f[k]=f[k*2]+f[k*2+1];
}
/*区间和*/int rr(int x,int y,int l,int r,int k)
{
if(x>=l&&r>=y)return sum[k];
int mid=(l+r)>>1,res=0;
if(x<=mid)res+=rr(x,y,l,mid,k*2);
else res+=rr(x,y,mid+1,r,k*2+1);
return res;
}
int main()
{
long long n,m;
read(n);read(m);
change(1,n,1);
for(int i=1;i<=m;i++)
{
long long a,b,c,d;
read(a);
if(a==1)
{
read(a);read(b);read(c);
xg(b,c,1,n,1,a);
}
else
{
read(a);read(b);
cout<<rr(a,b,1,n,1)<<endl;
}
}
}
Thanks♪(・ω・)ノ
回复
共 3 条回复,欢迎继续交流。
正在加载回复...