线段树1

复制代码
//单点修改查询 //http://ybt.ssoier.cn:8088/problem_show.php?pid=1549 //https://www.luogu.com.cn/problem/P1198 //用一维数组来存,当作完全二叉树来存 #include<bits/stdc++.h> using namespace std; const int N=2e5+10; long long int m,p,n,last,t; char op; struct node { int l,r,v; }tr[N*4]; void pushup(int u)//更新每个区间的最大值 { tr[u].v=max(tr[u*2].v,tr[2*u+1].v); } void build(int u,int l,int r)//建立线段树 { tr[u]={l,r}; if(l==r) return; int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r);//向左建立,向右建立 } int query(int u,int l,int r)//查询 { if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v; int mid=tr[u].l+tr[u].r>>1,v=0; if(l<=mid) v=query(2*u,l,r); if(r>mid) v=max(v,query(2*u+1,l,r)); return v; } int modify(int u,int x,int v)//修改 { if(tr[u].l==x&&tr[u].r==x) tr[u].v=v; else{ int mid=tr[u].l+tr[u].r>>1; if(x<=mid) modify(2*u,x,v); else modify(2*u+1,x,v); pushup(u); } } int main() { cin>>m>>p; build(1,1,m); while(m--){ cin>>op>>t; if(op=='Q'){ last=query(1,n-t+1,n); cout<<last<<endl; } else{ modify(1,n+1,(last+t)%p); n++; } } return 0; }
复制代码

 

复制代码
// //区间最大字段和 #include<bits/stdc++.h> using namespace std; const int N=2e6+10; int n,m,x,y,k,a[N]; struct node{ int l,r,all,lmax,rmax,sum; }tr[N*4]; void pushup(node &w,node &l,node &r) { w.sum=l.sum+r.sum; w.lmax=max(l.lmax,l.sum+r.lmax),w.rmax=max(r.sum+l.rmax,r.rmax); w.all=max(max(l.all,r.all),l.rmax+r.lmax); } void pushup(int u) { pushup(tr[u],tr[2*u],tr[2*u+1]); } void build(int u,int l,int r) { if(l==r) tr[u]={l,r,a[l],a[l],a[l],a[l]}; else{ tr[u]={l,r}; int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r); pushup(u); } } void modify(int u,int x,int v) { if(tr[u].l==x&&tr[u].r==x) tr[u]={x,x,v,v,v,v}; else{ int mid=tr[u].l+tr[u].r>>1; if(x<=mid) modify(2*u,x,v); else modify(2*u+1,x,v); pushup(u); } } node query(int u,int l,int r) { if(tr[u].l>=l&&tr[u].r<=r) return tr[u]; int mid=tr[u].l+tr[u].r>>1; if(r<=mid) return query(2*u,l,r); else if(l>mid) return query(2*u+1,l,r); else{ auto left=query(2*u,l,r),right=query(2*u+1,l,r); node res; pushup(res,left,right); return res; } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); while(m--){ cin>>k>>x>>y; if(k==1){ if(x>y) swap(x,y); cout<<query(1,x,y).all<<endl; } else modify(1,x,y); } return 0; }
复制代码

 

复制代码
//区间最大公约数 #include<bits/stdc++.h> using namespace std; const int N=1e6+10; char op; int n,m,a[N]; struct node { int l,r,sum,d; }tr[4*N]; void pushup(node &w,node &l,node &r) { w.sum=l.sum+r.sum; w.d=__gcd(l.d,r.d); } void pushup(int u) { pushup(tr[u],tr[2*u],tr[2*u+1]); } void build(int u,int l,int r) { if(l==r) tr[u]={l,r,a[r]-a[r-1],a[r]-a[r-1]}; else{ tr[u]={l,r}; int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r); pushup(u); } } void modify(int u,int x,int v) { if(tr[u].l==x&&tr[u].r==x) tr[u]={x,x,tr[u].sum+v,tr[u].sum+v}; else{ int mid=tr[u].l+tr[u].r>>1; if(x<=mid) modify(2*u,x,v); else modify(2*u+1,x,v); pushup(u); } } node query(int u,int l,int r) { if(tr[u].l>=l&&tr[u].r<=r) return tr[u]; int mid=tr[u].l+tr[u].r>>1; if(r<=mid) return query(2*u,l,r); else if(l>mid) return query(2*u+1,l,r); else{ auto left=query(2*u,l,r),right=query(2*u+1,l,r); node res; pushup(res,left,right); return res; } } int main() { int l,r,d; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); while(m--){ cin>>op>>l>>r; if(op=='Q'){ auto left=query(1,1,l),right=query(1,l+1,r); cout<<abs(__gcd(left.sum,right.d))<<endl; } else{ cin>>d; modify(1,l,d); if(r+1<=n) modify(1,r+1,-d); } } return 0; }
复制代码

 

复制代码
//区间修改 //线段树,懒标记 #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10; struct node { int l,r,sum,add; }tr[4*N]; char op; int n,m,d,k,t,a[N],l,r; void pushup(int u) { tr[u].sum=tr[2*u].sum+tr[2*u+1].sum; } void pushdown(int u) { auto &root=tr[u],&left=tr[2*u],&right=tr[2*u+1]; left.add+=root.add,left.sum+=(left.r-left.l+1)*root.add; right.add+=root.add,right.sum+=(right.r-right.l+1)*root.add; root.add=0; } void build(int u,int l,int r) { if(l==r) tr[u]={l,r,a[l],0}; else{ tr[u]={l,r}; int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r); pushup(u); } } void modify(int u,int l,int r,int d) { if(tr[u].l>=l&&tr[u].r<=r){ tr[u].sum+=(tr[u].r-tr[u].l+1)*d; tr[u].add+=d; } else{ pushdown(u); int mid=tr[u].l+tr[u].r>>1; if(l<=mid) modify(2*u,l,r,d); if(r>mid) modify(2*u+1,l,r,d); pushup(u); } } int query(int u,int l,int r) { if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum; pushdown(u); int mid=tr[u].l+tr[u].r>>1,summ=0; if(l<=mid) summ=query(2*u,l,r); if(r>mid) summ+=query(2*u+1,l,r); return summ; } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); while(m--){ cin>>op>>l>>r; if(op=='C') cin>>d,modify(1,l,r,d); else cout<<query(1,l,r)<<endl; } return 0; }
复制代码

 

复制代码
//亚特兰蒂斯 #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; struct segment { double x,y1,y2; int k; bool operator<(const segment&w)const { return x<w.x; } }seg[N*2]; struct node { int l,r,cnt; double len; }tr[N*8]; vector<double>ys; int n; int find(int x) { return lower_bound(ys.begin(),ys.end(),x)-ys.begin(); } void pushup(int u) { if(tr[u].cnt) tr[u].len=ys[tr[u].r+1]-ys[tr[u].l]; else if(tr[u].l!=tr[u].r) tr[u].len=tr[u*2].len+tr[u*2+1].len; else tr[u].len=0; } void build(int u,int l,int r) { tr[u]={l,r,0,0}; if(l!=r){ int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r); } } void modify(int u,int l,int r,int k) { if(tr[u].l>=l&&tr[u].r<=r) tr[u].cnt+=k,pushup(u); else{ int mid=tr[u].l+tr[u].r>>1; if(l<=mid) modify(2*u,l,r,k); if(r>mid) modify(2*u+1,l,r,k); pushup(u); } } signed main() { cin>>n; for(int i=0,j=0;i<n;i++){ double x1,x2,y1,y2; cin>>x1>>y1>>x2>>y2; seg[j++]={x1,y1,y2,1}; seg[j++]={x2,y1,y2,-1}; ys.push_back(y1),ys.push_back(y2); } sort(ys.begin(),ys.end()); ys.erase(unique(ys.begin(),ys.end()),ys.end()); build(1,0,ys.size()-2); sort(seg,seg+2*n); double res=0; for(int i=0;i<2*n;i++){ if(i>0) res+=tr[1].len*(seg[i].x-seg[i-1].x); modify(1,find(seg[i].y1),find(seg[i].y2)-1,seg[i].k); } cout<<res<<endl; return 0; }
复制代码
复制代码
//维护序列 #include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+10; int n,p,m,a[N],mod,x,y,z,k; struct node { int l,r,sum,add,mul; }tr[4*N]; void pushup(int u) { tr[u].sum=(tr[2*u].sum+tr[2*u+1].sum)%mod; } void val(node&t,int add,int mul) { t.sum=(t.sum*mul+(t.r-t.l+1)*add)%mod; t.mul=t.mul*mul%mod,t.add=(t.add*mul+add)%mod; } void pushdown(int u) { val(tr[2*u],tr[u].add,tr[u].mul),val(tr[2*u+1],tr[u].add,tr[u].mul); tr[u].mul=1,tr[u].add=0; } void build(int u,int l,int r) { if(l==r) tr[u]={l,r,a[r],0,1}; else{ tr[u]={l,r,0,0,1}; int mid=l+r>>1; build(2*u,l,mid),build(2*u+1,mid+1,r); pushup(u); } } void modify(int u,int l,int r,int add,int mul) { if(tr[u].l>=l&&tr[u].r<=r) val(tr[u],add,mul); else{ pushdown(u); int mid=tr[u].l+tr[u].r>>1; if(l<=mid) modify(2*u,l,r,add,mul); if(r>mid) modify(2*u+1,l,r,add,mul); pushup(u); } } int query(int u,int l,int r) { if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum; pushdown(u); int mid=tr[u].l+tr[u].r>>1,res=0; if(l<=mid) res=query(2*u,l,r)%mod; if(r>mid) res=(res+query(2*u+1,l,r))%mod; return res; } signed main() { cin>>n>>p;mod=p; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n); cin>>m; while(m--){ cin>>z>>x>>y; if(z==1) cin>>k,modify(1,x,y,0,k); else if(z==2) cin>>k,modify(1,x,y,k,1); else cout<<query(1,x,y)%mod<<endl; } return 0; }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17573099.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示