hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)
单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来。
http://acm.hdu.edu.cn/showproblem.php?pid=1166
update单点更新,query区域求和。
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 200001 using namespace std; struct node { int l,r; __int64 w; } q[4*N]; void pushup(int rt) { q[rt].w=q[rt*2].w+q[rt*2+1].w; } void build(int l,int r,int rt) { q[rt].l=l; q[rt].r=r; q[rt].w=0; if(l==r) { scanf("%I64d",&q[rt].w); return ; } build(l,(l+r)/2,rt*2); build((l+r)/2+1,r,rt*2+1); pushup(rt); } void update(int sum,int key,int l,int r,int rt) { if(sum<l||sum>r) return ; if(l==r&&sum==l) { q[rt].w+=(__int64)key; return ; } update(sum,key,l,(l+r)/2,rt*2); update(sum,key,(l+r)/2+1,r,rt*2+1); pushup(rt); } __int64 query(int ll,int rr,int l,int r,int rt) { if(ll>r||rr<l) return 0; if(ll<=l&&rr>=r) { return q[rt].w; } return query(ll,rr,l,(l+r)/2,rt*2)+query(ll,rr,(l+r)/2+1,r,rt*2+1); } int main() { int n,sum1,sum2,T,K=0; char a[10]; scanf("%d",&T); while(T--) { K++; scanf("%d",&n); build(1,n,1); printf("Case %d:\n",K); while(scanf("%s",a)!=EOF) { if(strcmp(a,"End")==0) break; else if(strcmp(a,"Query")==0) { scanf("%d%d",&sum1,&sum2); __int64 t=query(sum1,sum2,1,n,1); printf("%I64d\n",t); } else if(strcmp(a,"Sub")==0) { scanf("%d%d",&sum1,&sum2); update(sum1,-sum2,1,n,1); } else if(strcmp(a,"Add")==0) { scanf("%d%d",&sum1,&sum2); update(sum1,sum2,1,n,1); } } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=1754
update单点替换,query区间最值
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 200001 using namespace std; struct node { int l,r; __int64 w; }q[4*N]; void pushup(int rt) { q[rt].w=max(q[rt*2].w,q[rt*2+1].w); } void build(int l,int r,int rt) { q[rt].l=l; q[rt].r=r; q[rt].w=0; if(l==r) { scanf("%I64d",&q[rt].w); return ; } build(l,(l+r)/2,rt*2); build((l+r)/2+1,r,rt*2+1); pushup(rt); } void update(int sum,int key,int l,int r,int rt) { if(sum<l||sum>r) return ; if(l==r&&sum==l) { q[rt].w=(__int64)key; return ; } update(sum,key,l,(l+r)/2,rt*2); update(sum,key,(l+r)/2+1,r,rt*2+1); pushup(rt); } __int64 query(int ll,int rr,int l,int r,int rt) { if(ll>r||rr<l) return 0; if(ll<=l&&rr>=r) { return q[rt].w; } return max(query(ll,rr,l,(l+r)/2,rt*2),query(ll,rr,(l+r)/2+1,r,rt*2+1)); } int main() { int n,m,sum1,sum2; char a[3]; while(scanf("%d%d",&n,&m)!=EOF) { build(1,n,1); while(m--) { scanf("%s%d%d",a,&sum1,&sum2); if(a[0]=='U') { update(sum1,sum2,1,n,1); } else if(a[0]=='Q') { __int64 t=query(sum1,sum2,1,n,1); printf("%I64d\n",t); } } } return 0; }
分类:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构