蓝桥杯操作格子(线段树)
赤裸裸的线段树
#include<iostream> #include<cstdio> #include<algorithm> #define Max(a,b) (a>b)?a:b using namespace std; const int MAX_N=100005*4;//至少要开2*n-1个空间 typedef long long LL; struct node{ int l,r,max; LL sum; }; node a[MAX_N]; void build(int n,int l,int r) { a[n].l=l; a[n].r=r; a[n].max=-1; a[n].sum=0; if(l==r) { return ; } build(2*n,l,(l+r)/2); build(2*n+1,(l+r)/2+1,r); } void insert(int n, int pos,int val) { a[n].sum+=val; a[n].max=max(a[n].max,val); if(a[n].l==pos&&a[n].r==pos) { return ; } int mid=(a[n].l+a[n].r)/2; if(pos<=mid) insert(2*n,pos,val); else insert(2*n+1,pos,val); } void change(int n,int pos,int val) { if(a[n].l==pos&&a[n].r==pos) { a[n].max=val; a[n].sum=val; return ; } int mid=(a[n].l+a[n].r)/2; if(pos<=mid) change(2*n,pos,val); else change(2*n+1,pos,val); a[n].max=max(a[2*n].max,a[2*n+1].max); a[n].sum=a[2*n].sum+a[2*n+1].sum; } int Qmax(int n,int l,int r) { if(a[n].l==l&&a[n].r==r) { return a[n].max; } int mid=(a[n].l+a[n].r)/2; if(r<=mid) { return Qmax(2*n,l,r); } else if(mid<l) { return Qmax(2*n+1,l,r); } else { return Max(Qmax(2*n,l,mid),Qmax(2*n+1,mid+1,r)); } } LL Qsum(int n,int l, int r) { if(a[n].l==l&&a[n].r==r) { return a[n].sum; } int mid=(a[n].l+a[n].r)/2; if(r<=mid) { return Qsum(2*n,l,r); } else if(l>mid) { return Qsum(2*n+1,l,r); } return Qsum(2*n,l,mid)+Qsum(2*n+1,mid+1,r); } int main() { int n,m; scanf("%d %d",&n,&m); build(1,1,n); for(int i=1;i<=n;i++) { int v; scanf("%d",&v); insert(1,i,v); } while(m--) { int op,x,y; scanf("%d %d %d",&op,&x,&y); switch(op) { case 1:{ change(1,x,y); break; } case 2:{ printf("%lld\n",Qsum(1,x,y)); break; } case 3:{ printf("%d\n",Qmax(1,x,y)); break; } } } return 0; }
下面代码简介但时间慢
#include<cstdio> #include<algorithm> #define lson n<<1,l,mid #define rson n<<1|1,mid+1,r #define ENmax a[n].max=max(a[n<<1].max,a[n<<1|1].max) #define ENsum a[n].sum=a[n<<1].sum+a[n<<1|1].sum using namespace std; const int MAX_N=100005; typedef long long LL; struct node{ int l,r,max; LL sum; }; node a[MAX_N<<2]; void Build(int n,int l,int r) { a[n].l=l; a[n].r=r; if(l==r) { scanf("%d",&a[n].sum); a[n].max=a[n].sum; return ; } int mid=(l+r)>>1; Build(lson); Build(rson); ENmax; ENsum; } void Update(int n,int pos,int val) { if(a[n].l==pos&&a[n].r==pos) { a[n].max=a[n].sum=val; return ; } int mid=(a[n].l+a[n].r)>>1; if(pos<=mid) Update(n<<1,pos,val); else Update(n<<1|1,pos,val); ENsum; ENmax; } LL Qsum(int n,int l,int r) { if(a[n].l==l&&a[n].r==r) { return a[n].sum; } int mid=(a[n].l+a[n].r)>>1; if(r<=mid) return Qsum(n<<1,l,r); else if(mid<l) return Qsum(n<<1|1,l,r); else return Qsum(lson)+Qsum(rson); } int Qmax(int n,int l,int r) { if(a[n].l==l&&a[n].r==r) { return a[n].max; } int mid=(a[n].l+a[n].r)>>1; if(r<=mid) return Qmax(n<<1,l,r); else if(mid<l) return Qmax(n<<1|1,l,r); else return max(Qmax(lson),Qmax(rson)); } int main() { int n,m; scanf("%d%d",&n,&m); Build(1,1,n); while(m--) { int op,x,y; scanf("%d%d%d",&op,&x,&y); if(op==1) Update(1,x,y); else if(op==2) printf("%d\n",Qsum(1,x,y)); else printf("%d\n",Qmax(1,x,y)); } return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!