社区讨论
封装类+指针线段树求调
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 条回复,欢迎继续交流。
正在加载回复...