社区讨论

wa10pts求条 动态开点线段树

P13825【模板】线段树 1.5参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mii7xtiu
此快照首次捕获于
2025/11/28 10:03
3 个月前
此快照最后确认于
2025/11/29 13:45
3 个月前
查看原帖
rt,只有最后一个点A了
CPP
#include<bits/stdc++.h>
#define int unsigned long long 
using namespace std;
const int N=1e5+5;
int n,m,ls[N*120],rs[N*120],tot,s[N*120],lz[N*120],rt;
void pd(int u,int l,int r,int mid){
	if(!lz[u])return;
	if(!ls[u])ls[u]=++tot;
	if(!rs[u])rs[u]=++tot;
	s[ls[u]]+=(mid-l+1)*lz[u],lz[ls[u]]+=lz[u];
	s[rs[u]]+=(r-mid)*lz[u],lz[rs[u]]+=lz[u];
	lz[u]=0;
}
void mdy(int &u,int l,int r,int k,int lc,int rc){
	if(rc<l||r<lc)return;
	if(!u)u=++tot;
	if(l<=lc&&rc<=r){
		s[u]+=(rc-lc+1)*k,lz[u]+=k;
		return;
	}
	int mid=(lc+rc)>>1;
	pd(u,lc,rc,mid);
	mdy(ls[u],l,r,k,lc,mid);
	mdy(rs[u],l,r,k,mid+1,rc);
	s[u]+=s[ls[u]]+s[rs[u]];
}
int que(int u,int l,int r,int lc,int rc){
	if(rc<l||lc>r)return 0;
	if(l<=lc&&rc<=r)return s[u];
	int mid=(lc+rc)>>1;
	pd(u,lc,rc,mid);
	return que(ls[u],l,r,lc,mid)+que(rs[u],l,r,mid+1,rc);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int opt,l,r,k;m;m--){
		cin>>opt>>l>>r;
		if(opt==1){
			cin>>k;
			mdy(rt,l,r,k,1,n);
		}
		else cout<<(l+r)*(r-l+1)/2+que(rt,l,r,1,n)<<"\n";
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...