第一个自己动手写的线段树,1Y还是有点小激动哈(虽然是模版题)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int SIZE=200005;
 6 const int INF=1000000;
 7 int maxv[SIZE<<2];
 8 int num[SIZE];
 9 void build(int l,int r,int rt)
10 {
11     if(l==r){
12         maxv[rt]=num[l];
13         return ;
14     }
15     int mid=(l+r)>>1;
16     build(l,mid,rt<<1);
17     build(mid+1,r,rt<<1|1);
18     maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
19 }
20 int findmax(int L,int R,int l,int r,int rt)
21 {
22     if(L<=l&&R>=r) return maxv[rt];
23     int mid=(l+r)>>1;
24     int ret=-INF;
25     if(L<=mid) ret=max(ret,findmax(L,R,l,mid,rt<<1));
26     if(R>mid) ret=max(ret,findmax(L,R,mid+1,r,rt<<1|1));
27     return ret;
28 }
29 void update(int l,int r,int rt,int v,int p)
30 {
31     int mid=(l+r)>>1;
32     if(l==r) maxv[rt]=p;
33     else{
34         if(v<=mid) update(l,mid,rt<<1,v,p);
35          else update(mid+1,r,rt<<1|1,v,p);
36         maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
37     }
38 }
39 int main()
40 {
41     //freopen("data.in","r",stdin);
42     int m,n;
43     int i,j;
44     while(scanf("%d%d",&n,&m)!=EOF)
45     {
46         for(i=1;i<=n;i++)
47             scanf("%d",&num[i]);
48         build(1,n,1);
49         for(i=1;i<=m;i++)
50         {
51             int a,b;
52             char c;
53             getchar();
54             scanf("%c %d %d",&c,&a,&b);
55             if(c=='Q')
56                 printf("%d\n",findmax(a,b,1,n,1));
57             else if(c=='U')
58                 update(1,n,1,a,b);
59         }
60     }
61     return 0;
62 }

虽然自己理解线段树也不深刻,只是掌握了一点皮毛而已,但是觉得线段树的理解在于它是一颗完全二叉树因此可以以数组的形式表示出来。再加上只要理解好线段树的区间覆盖的问题我想基本的题还是能写了

转载于:https://www.cnblogs.com/acalvin/p/3588689.html

HDU 1754线段树相关推荐

  1. I Hate It HDU - 1754 (线段树)

    注意点:scanf中使用%c时,会读取空格和回车,所以在%c之前要有一个空格 ( 或者直接使用%s也行,%s会忽略空格和回车 ).具体见下面的代码: 1 #include<iostream> ...

  2. hdu 1754 线段树(点修改)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  4. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  5. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  6. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  7. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

  8. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  9. HDU 5238 线段树+数论

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...

最新文章

  1. DL之U-Net:U-Net算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  2. java中的多线程——进度1
  3. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用
  4. RecyclerView滑动到底部自动加载
  5. 唐诗辑注 —— 辛夷坞、南园十三首、问六十九
  6. Java小白的干货铺子(四)
  7. android之Fragment(官网资料翻译)
  8. 4.Linux/Unix 系统编程手册(上) -- 文件IO:通用的IO模型
  9. PBC密码学库使用指南
  10. 2020年“华为杯”中国研究生数学建模竞赛
  11. lisp 多段线转面域_CAD自定义线型,lisp多段线绘制方向 | 伙计百科
  12. vue中使用粒子特效
  13. 【转】欧姆龙FINS通讯命令实例详解
  14. flask实现浏览器实时视频播放
  15. 以太网网卡的结构和工作原理
  16. Android Q 上的Biometric生物识别之Face人脸识别流程
  17. 物料编码的方法与技术
  18. 人是Web3最终进化
  19. onload和ready的不同
  20. Redis压测工具(redis-benchmark)

热门文章

  1. day24 01 初识继承
  2. postman测试工具
  3. lua_string_pattern
  4. jQuery插件开发教程
  5. Objective-C 深复制和浅复制与NSCopying协议
  6. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
  7. confusion_matrix(混淆矩阵)
  8. Centos 能ping通域名和公网ip但是网站不能够打开,服务器拒绝了请求。打开80端口解决。...
  9. 【笔记篇】C#笔记2
  10. Yii2.0 rules常用验证规则