#include <bits/stdc++.h>
// #define For0(x) for (int i = 0; i < x; i++)
#define For(x) for (int i=1; i <=x; i++)
#define Fors(x,y) for(int i=1;i<=x;i++)for(int j=1;j<=y;j++)
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define per(i,x,y) for(int i=y;i>=x;--i)
#define max_(x,y) x>y?x:y
#define min_(x,y) x<y?x:y
#define pii pair<int,int>
#define fi first
#define se second
#define dc(x,y) cout<<"debug:"<<"[" << x <<"]:"<<y<<endl
#define all(x) (x).begin(),(x).end()
using namespace std;
#define ll long long
struct ltrst
{
// int max_p
vector<int> ltra,addt,a;
explicit ltrst(int n) : ltra(n*4,0),addt(n*4,0) {}
void build(){
build(0,a.size()-1,1);
}
void build(int l,int r,int p){
if(l==r) {ltra[p]=a[l];return;}
int mid = (l+r)/2;
build(l,mid,p*2),build(mid+1,r,p*2+1);
ltra[p]=ltra[p*2]+ltra[p*2+1];
}
int query(int l,int r){
return query(l,r,1,a.size(),1);
}
int query(int l,int r,int s,int e,int p){
if(l <= s && e <= r) return ltra[p];
int mid = (s+e)/2, ans = 0;
//处理addt
if(addt[p]){
int t = addt[p];
addt[p]=0;
addt[p*2]+=t,ltra[p*2]+=(mid-s+1)*t;
addt[p*2+1]+=t,ltra[p*2+1]+=(e-mid+1)*t;
}
// s e 从1-sizeof a 循环作用是迭代p的下标值
// 全程是s e在动态变化,变化的方法等同于build,所以说一定以最优方式发生匹配
if(l <= mid) ans += query(l, r, s, mid, p*2); //l<=mid的时候,lr区间在mid左侧,二分
if(r > mid) ans += query(l, r, mid+1, e, p*2+1); //相反
return ans;
}
void add(int l,int r,int t){
add(l,r,1,a.size(),1,t);
}
void add(int l,int r,int s,int e,int p,int t){
if(l <= s && e <= r) {
ltra[p]+=((e-s+1)*t); //更新大区间的val
addt[p]+=t; //下面的ltra不操作,更新addt,等访问到该p的时候再对下面的进行操作;
return;
}
int nl=max_(l,s),nr=min_(r,e);
ltra[p]+=(nr-nl+1)*t;
int mid = (s+e)/2, ans = 0;
if(l <= mid) {add(l, r, s, mid, p*2, t);}
if(r > mid) {add(l, r, mid+1, e, p*2+1, t);}
}
void pt(){
int spn=2;
for(int i=1;i<11;i++) {
if(i%spn==0){
cout<<endl;
spn*=2;
}
printf("%d[%d] ",ltra[i],addt[i]);
}
cout<<endl<<endl;
}
};
void solve() {
ltrst ltr(5);
for(int i=10; i<=14; i++){
ltr.a.push_back(i);
}
ltr.build();
ltr.pt();
ltr.add(3,5,5);
ltr.pt();
cout << endl;
cout << ltr.query(3,4) << endl;
// cout << ltr.query(1,4) << endl;
}
signed main() {
cin.tie(0);
ios::sync_with_stdio(false);
int t=1;
// cin >> t;
while (t--) solve();
// cout << solve() << '\n';
}
最后修改:2025 年 03 月 30 日 11 : 35 AM
© 允许规范转载