博主为了Ctrl+C方便,没事写了这篇文章(以后持续更新)
现在包括的操作有:单点修改(单点加)、区间求和、区间加(修改)、线段树二分
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define LL long long
const int N=1000010;
const int MAX=1e9+7;
int n,k;
int a[N],len;
inline void R(int &v)
{
v=0;
char ch=getchar();
int f=0;
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)){v=(v<<3)+(v<<1)+ch-'0';ch=getchar();}
if(f) v=-v;
}
namespace ib {char b[100];}
inline void P(int x)
{
if(x==0) {putchar(48); return;}
if(x<0) {putchar('-'); x=-x;}
char *s=ib::b;
while(x) *(++s)=x%10, x/=10;
while(s!=ib::b) putchar((*(s--))+48);
}
struct Segtree
{
struct trie
{
int l,r,len;
int sum;
int lz;
}tree[N<<2];
void updata(int o)//更新
{
tree[o].sum=tree[o<<1].sum+tree[o<<1|1].sum;
}
void build(int o,int l,int r)//建树
{
tree[o].sum=0;
tree[o].l=l;
tree[o].r=r;
tree[o].len=r-l+1;
if(l==r) {tree[o].sum=a[l];return;}
int mid=(l+r)>>1;
build(o<<1,l,mid);
build(o<<1|1,mid+1,r);
updata(o);
}
void release(int o)//更新懒标记
{
int lo=o<<1,ro=o<<1|1;
tree[lo].lz+=tree[o].lz;
tree[lo].sum+=tree[o].lz*tree[lo].len;
tree[ro].lz+=tree[o].lz;
tree[ro].sum+=tree[o].lz*tree[ro].len;
tree[o].lz=0;
}
void modify(int o,int ql,int qr,int v)//区间加
{
int l=tree[o].l,r=tree[o].r;
if(l>qr||r<ql) return;
if(l==ql&&r==qr)
{
tree[o].lz=v;
tree[o].sum+=v*tree[o].len;
return;
}
if(l==r) return;
release(o);
int mid=l+r>>1;
if(qr<=mid) modify(o<<1,ql,qr,v);
if(ql>mid) modify(o<<1|1,ql,qr,v);
if(ql<=mid&&qr>mid)
{
modify(o<<1,ql,mid,v);
modify(o<<1|1,mid+1,qr,v);
}
updata(o);
}
int query(int o,int ql,int qr)//区间和
{
int l=tree[o].l,r=tree[o].r;
if(ql<=l&&qr>=r) return tree[o].sum;
release(o);
int res=0;
int mid=l+r>>1;
if(qr<=mid) res+=query(o<<1,ql,qr);
if(ql>mid) res+=query(o<<1|1,ql,qr);
if(ql<=mid&&qr>mid)
{
res+=query(o<<1,ql,mid)+query(o<<1|1,mid+1,qr);
}
updata(o);
return res;
}

3016

被折叠的 条评论
为什么被折叠?



