求助
  • 板块灌水区
  • 楼主CNC201101
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/7/16 13:19
  • 上次更新2023/11/3 09:33:33
查看原帖
求助
1030778
CNC201101楼主2023/7/16 13:19

线段树模板170分求助 听说灌水去大佬多

	#include<bits/stdc++.h>
	using namespace std;
	int a[1000005];
	struct node
	{
		int l,r,w,f;
	}tree[4000005];
	int c,x,y,z,n,m;
	void build(int k,int ll,int rr)
	{
		int mid;
		if(ll>rr)  return;
		if(ll==rr){
			tree[k].l=ll;
			tree[k].r=rr;
			tree[k].w=a[ll];
			return;
		}
		mid=(ll+rr)/2;
		build(k*2,ll,mid);
		build(k*2+1,mid+1,rr);
		tree[k].l=ll;
		tree[k].r=rr;
		tree[k].w=tree[k*2].w+tree[k*2+1].w;
		return;
	}
	
	void down(int k)
	{
	    tree[k*2].w+=((tree[k*2].r-tree[k*2].l+1)*tree[k].f);
	    tree[k*2+1].w+=((tree[k*2+1].r-tree[k*2+1].l+1)*tree[k].f);
	    tree[k*2].f+=tree[k].f;
	    tree[k*2+1].f+=tree[k].f;
	    tree[k].f=0;
		return;
	}
	void add(int k,int t,int w)
	{
		int mid;
		if(t>w) return;
		if(x<=t && w<=y){
			tree[k].w+=(w-t+1)*z;
			tree[k].f+=z;
			return;
		}
		mid=(t+w)/2;
		if(tree[k].f) down(k);
		if(x<=mid) add(k*2,t,mid);
		if(y>mid) add(k*2+1,mid+1,w);
		tree[k].w=tree[k*2].w+tree[k*2+1].w;
		return;
	}
	
	int ask(int k,int t,int w)
	{ 	int mid;
		if(t>w) return 0;
		if(x<=t&&w<=y){
			return tree[k].w;
		}
		mid=(t+w)/2;
		if(tree[k].f) down(k); 
		int sum=0;
		if(x<=mid) sum+=ask(k*2,t,mid);
		if(y>mid) sum+=ask(k*2+1,mid+1,w);
		tree[k].w=tree[k*2].w+tree[k*2+1].w;
		return sum;
	}
	int main()
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		build(1,1,n);
		while(m--){
			cin>>c>>x>>y;
			if(c==1){
				cin>>z;
				add(1,1,n);
			}
			else printf("%d\n",ask(1,1,n));
		}
		return 0;
	}
2023/7/16 13:19
加载中...