HDU 1754--线段树

中文题,不解释。。

思路:

线段树功能:update:单点替换 quary:区间最值

代码:

 

 

复制代码
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 #define maxn 200100
 5 #define lson l,m,rt<<1
 6 #define rson m+1,r,rt<<1|1
 7 int Max[maxn<<2];
 8 int MMax(int a,int b)
 9 {
10     return a<b?b:a;
11 }
12 void Pushup(int rt)
13 {
14     Max[rt]=MMax(Max[rt<<1],Max[rt<<1|1]);
15 }
16 void build(int l,int r,int rt)
17 {
18     if(r==l)
19     {
20         scanf("%d",&Max[rt]);
21         return;
22     }
23     int m=(l+r)>>1;
24     build(lson);
25     build(rson);
26     Pushup(rt);
27 }
28 void update(int pos,int add,int l,int r,int rt)
29 {
30     if(r==l)
31     {
32         Max[rt]=add;
33         return;
34     }
35     int m=(l+r)>>1;
36     if(pos<=m) update(pos,add,lson);
37     else update(pos,add,rson);
38     Pushup(rt);
39 }
40 int quary(int L,int R,int l,int r,int rt)
41 {
42     if(L<=l&&R>=r)
43         return Max[rt];
44     int m=(l+r)>>1;
45     int ret=0;
46     if(L<=m) ret=MMax(quary(L,R,lson),ret);
47     if(R>m) ret=MMax(quary(L,R,rson),ret);
48     return ret;
49 }
50 int main()
51 {
52     int m,n,a,b;
53     char ch;
54     while(~scanf("%d %d",&n,&m))
55     {
56         build(1,n,1);
57         while(m--)
58         {
59             scanf(" %c %d %d ",&ch,&a,&b);
60             if(ch=='Q')
61                 printf("%d\n",quary(a,b,1,n,1));
62             else
63                 update(a,b,1,n,1);
64         }
65     }
66     return 0;
67 }
复制代码

 

 

 

 

 

posted on 2013-02-06 21:50  acoderworld  阅读(36)  评论(0)    收藏  举报

编辑推荐:
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 一个 java 空指针异常的解决过程
阅读排行:
· 干翻 Typora!MilkUp:完全免费的桌面端 Markdown 编辑器!
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 从WebApi迁移到Minimal API?有了这个神器,小白也能10分钟搞定!
· 抛开官方库,手撸一个轻量级 MCP 服务端
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

点击右上角即可分享
微信分享提示