线段树求调,没输出
  • 板块学术版
  • 楼主Q__A__Q
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/4/10 16:53
  • 上次更新2023/10/28 04:04:02
查看原帖
线段树求调,没输出
372172
Q__A__Q楼主2022/4/10 16:53

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int ll

const int maxn=1e5+10;
int n,m,sum[maxn<<2],add[maxn<<2],a[maxn];

inline int read() {
	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();
	return s*w;
}

inline void push_up(int root) {
	sum[root]=sum[root<<1]+sum[root<<1|1];
} // 更新点信息

inline void build(int l,int r,int root) {
	if(l==r) {
		sum[root]=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(l,m,root<<1);
	build(m+1,r,root<<1|1);
	push_up(root);
} // 建树

inline void push_down(int root,int ln,int rn) {
	if(add[root]) {
		add[root<<1]+=add[root];
		add[root<<1|1]+=add[root];
		sum[root<<1]+=add[root]*ln;
		sum[root<<1|1]+add[root]*rn;
		add[root]=0;
	}
} // 下推标记

inline void update_sec(int L,int R,int c,int l,int r,int root) {
	if(L<=l&&R>=r) {
		sum[root]+=c*(r-l+1);
		add[root]+=c;
		return;
	}
	int m=(l+r)>>1;
	push_down(root,m-l+1,r-m);
	if(L<=m) update_sec(L,R,c,l,m,root<<1);
	if(R>m) update_sec(L,R,c,m+1,r,root<<1|1);
	push_up(root);
} // 区间修改 a[L,R]+=c;

inline int query(int L,int R,int l,int r,int root) {
	if(l==r) return sum[root];
	int m=(l+r)>>1,ans=0;
	if(L<=m) ans+=query(L,R,l,m,root<<1);
	if(R>m) ans+=query(L,R,m+1,r,root<<1|1);
	return ans;
} // 区间查询

signed main() {
//	freopen("segtree.in","r",stdin);
//	freopen("segtree.out","w",stdout);
	build(1,n,1); 
	n=read(),m=read();
	for(int i=1;i<=n;++i) a[i]=read();
	while(m--) {
		int k=read(),l,r,c;
		if(k==1) {
			l=read(),r=read(),c=read();
			update_sec(l,r,c,1,n,1);
		}
		else {
			l=read(),r=read();
			printf("%lld\n",query(l,r,1,n,1));
		}
	}
	return 0;
}

2022/4/10 16:53
加载中...