线段树区间最小值求助

灌水区

@[ChenZQ](/user/745358) 离谱...出题新建一个op怎么了
by Acerakoi @ 2024-03-20 20:42:18


@[ChenZQ](/user/745358) 我是若只,a和b是要加1的啊啊啊。 ``` #include<bits/stdc++.h> using namespace std; const int maxn=1e5; typedef long long ll; struct node{ ll l,r; ll sum; ll lazy; }SegTree[maxn<<2]; void BuildTree(int rt,int l,int r){ SegTree[rt].l=l,SegTree[rt].r=r; SegTree[rt].lazy=0; if(l==r){ cin>>SegTree[rt].sum; return; } BuildTree(rt<<1,l,(l+r)>>1); BuildTree(rt<<1|1,((l+r)>>1)+1,r); SegTree[rt].sum=min(SegTree[rt<<1].sum,SegTree[rt<<1|1].sum); } void PushDown(int rt){ if(SegTree[rt].lazy){ SegTree[rt<<1].lazy+=SegTree[rt].lazy; SegTree[rt<<1|1].lazy+=SegTree[rt].lazy; SegTree[rt<<1].sum+=(SegTree[rt<<1].r-SegTree[rt<<1].l+1)*SegTree[rt].lazy; SegTree[rt<<1|1].sum+=(SegTree[rt<<1|1].r-SegTree[rt<<1|1].l+1)*SegTree[rt].lazy; SegTree[rt].lazy=0; } } void UpDate(int rt,int c,int l,int r){ if(SegTree[rt].l==l&&SegTree[rt].r==r){ SegTree[rt].lazy+=c; SegTree[rt].sum+=(SegTree[rt].r-SegTree[rt].l+1)*c; return; } if(SegTree[rt].l==SegTree[rt].r){ return; } PushDown(rt); int mid=(SegTree[rt].l+SegTree[rt].r)/2; if(r<=mid){ UpDate(rt<<1,c,l,r); } else if(l>mid){ UpDate(rt<<1|1,c,l,r); } else{ UpDate(rt<<1,c,l,mid); UpDate(rt<<1|1,c,mid+1,r); } SegTree[rt].sum=min(SegTree[rt<<1].sum,SegTree[rt<<1|1].sum); } ll QueryTree(int rt,int l,int r){ if(SegTree[rt].l==l&&SegTree[rt].r==r){ return SegTree[rt].sum; } PushDown(rt); int mid=(SegTree[rt].r+SegTree[rt].l)>>1; ll ans; if(r<=mid){ ans=QueryTree(rt<<1,l,r); } else if(l>mid){ ans=QueryTree(rt<<1|1,l,r); } else{ ans=min(QueryTree(rt<<1,l,mid),QueryTree(rt<<1|1,mid+1,r)); } return ans; } int main(){ int n,m; cin>>n; BuildTree(1,1,n); cin>>m; getchar(); while(m--){ string s; getline(cin,s); int a=0,b=0,c=0,j=0,t=s.size(); while(j<t && isdigit(s[j])) a=a*10+s[j]-'0',j++; j++; while(j<t && isdigit(s[j])) b=b*10+s[j]-'0',j++; a++,b++;//我是弱智 if(j+2>t){ //cout<<a<<' '<<b<<endl; cout<<QueryTree(1,a,b)<<endl; } else{ j++; int flag=0; while((s[j]=='-' || isdigit(s[j])) && j<t) { if(s[j]=='-') flag=-1; else c=c*10+s[j]-'0'; j++; } cin>>c; UpDate(1,c,a,b); } } return 0; } ```
by xzz_cat6 @ 2024-03-21 09:24:21


上一页 |