社区讨论

封装类+指针线段树求调

P3372【模板】线段树 1参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mhjtvxoc
此快照首次捕获于
2025/11/04 08:26
4 个月前
此快照最后确认于
2025/11/04 08:26
4 个月前
查看原帖
rt,样例没过+0pts,DeepSeek也没看出哪儿错了 /kel
C
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<string>
#include<utility>
#include<numeric>
#include<functional>
using namespace std;
namespace ext{
	template<class ValType,class TagType>
	class SegmentTree{
	private:
		typedef unsigned size_t;
		template<class _ValType,class _TagType>
		struct TreeNode{
			_ValType val;
			_TagType tag;
			size_t lpos,rpos,sz;
			TreeNode<_ValType,_TagType> *left=nullptr,*right=nullptr;
			TreeNode():tag(0){}
			void pushup(){
				val=ValType();
				if(left) val+=left->val;
				if(right) val+=right->val;
			}
			void pushdown(){
				if(!tag) return;
				if(left) left->val+=tag*left->sz,left->tag+=tag;
				if(right) right->val+=tag*right->sz,right->tag+=tag;
				tag=TagType();
			}
		};
		typedef TreeNode<ValType,TagType> node;
		node *root;
	public:
		SegmentTree(vector<ValType> _arr){
			function<void(node*&,size_t,size_t)> _build=[&](node*& cur,size_t _l,size_t _r){
				if(_l==_r){
					cur->val=_arr[_l];
					cur->lpos=_l,cur->rpos=_r,cur->sz=1;
					return;
				}
				size_t _m=(_l+_r)>>1;
				cur->lpos=_l,cur->rpos=_r,cur->sz=_r-_l+1;
				cur->left=new node(),cur->right=new node();
				_build(cur->left,_l,_m);
				_build(cur->right,_m+1,_r);
				cur->pushup();
			};
			size_t _n=_arr.size()-1;
			root=new node();
			_build(root,1,_n);
		}
		~SegmentTree(){
			function<void(node*&)> _del=[&](node*& cur){
				if(!cur) return;
				_del(cur->left);
				_del(cur->right);
				delete cur;
			};
			_del(root);
		}
		void update(size_t _l,size_t _r,ValType _x){
			function<void(node*&,size_t,size_t,ValType)> _update=[&](node*& cur,size_t _l,size_t _r,ValType _x){
				if(_l>=cur->lpos&&_r<=cur->rpos){
					cur->val+=_x*cur->sz;
					cur->tag+=_x;
					return;
				}
				cur->pushdown();
				size_t _m=(cur->lpos+cur->rpos)>>1;
				if(_l<=_m) _update(cur->left,_l,_r,_x);
				if(_r>_m) _update(cur->right,_l,_r,_x);
				cur->pushup();
			};
			_update(root,_l,_r,_x);
		}
		ValType query(size_t _l,size_t _r){
			function<ValType(node*&,size_t,size_t)> _query=[&](node*& cur,size_t _l,size_t _r)->ValType{
				if(_l>=cur->lpos&&_r<=cur->rpos) return cur->val;
				cur->pushdown();
				size_t _m=(cur->lpos+cur->rpos)>>1;
				ValType ans=ValType();
				if(_l<=_m) ans+=_query(cur->left,_l,_r);
				if(_r>_m) ans+=_query(cur->right,_l,_r);
				return ans;
			};
			return _query(root,_l,_r);
		}
	};
}
typedef long long ll;
const int N=1e5+5;
int n,m,op,x,y,k;
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>m;
	vector<ll> a(n+1);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	ext::SegmentTree<ll,ll> tree(a);
	for(int i=1;i<=m;i++){
		cin>>op>>x>>y;
		if(op==1){ cin>>k; tree.update(x,y,k); }
		else cout<<tree.query(x,y)<<"\n";
	}
	return 0;
}

回复

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

正在加载回复...