博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树(单点更新,区间查询) HDU 1754 I Hate It
阅读量:4701 次
发布时间:2019-06-09

本文共 1536 字,大约阅读时间需要 5 分钟。

线段树的模板

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 9 using namespace std;10 11 const int Maxn = 2e6 + 10;12 int fa[Maxn];13 struct node14 {15 int l, r;16 int value;17 int mid() {18 return (l + r) / 2;19 }20 }s[Maxn];21 void build(int i, int l, int r)22 {23 s[i].l = l;24 s[i].r = r;25 s[i].value = 0;26 while (r == l) {27 fa[l] = i;28 return;29 }30 build(i * 2, l, (l + r) / 2);31 build(i * 2 + 1, (l + r) / 2 + 1, r);32 }33 void updata(int x)34 {35 if (x == 1) return;36 int fi = x / 2;37 int a = s[fi * 2].value;38 int b = s[fi * 2 + 1].value;39 s[fi].value = max(a, b);40 updata(fi);41 }42 int Max;43 void query(int i, int l, int r)44 {45 if (s[i].l == l && s[i].r == r) {46 Max = max(Max, s[i].value);47 return;48 }49 int m = s[i].mid();50 if (r <= m) query(i << 1, l, r);51 else if (l > m) query(i << 1 | 1, l, r);52 else {53 query(i << 1, l, m);54 query(i << 1 | 1, m + 1, r);55 }56 57 }58 int main()59 {60 int n, m;61 while (scanf("%d %d", &n, &m) == 2) {62 build(1, 1, n);63 for (int i = 1;i <= n;i++) {64 int x;65 scanf("%d", &x);66 s[fa[i]].value = x;67 updata(fa[i]);68 }69 while (m--) {70 char t[10];71 int a, b;72 scanf("%s", t);73 scanf("%d %d", &a, &b);74 if (t[0] == 'Q') {75 Max = 0;76 query(1, a, b);77 printf("%d\n", Max);78 }79 else {80 s[fa[a]].value = b;81 updata(fa[a]);82 }83 }84 }85 return 0;86 }

 

转载于:https://www.cnblogs.com/chenchen-12/p/9876693.html

你可能感兴趣的文章
PAT乙级(Basic Level)练习题-NowCoder数列
查看>>
HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器
查看>>
[小白知识记录]--浏览器打开一个新窗口记录
查看>>
C++ Prime:const的引用
查看>>
SVM
查看>>
Java中删除文件、删除目录及目录下所有文件
查看>>
MiCode108 猜数字
查看>>
在Eclipse中Attach Source
查看>>
<Unity项目框架相关>一
查看>>
Vim 基本命令入门
查看>>
Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)...
查看>>
不走弯路,就是捷径
查看>>
函数的记忆
查看>>
Linux centos7安装Mongodb
查看>>
svn自动备份并上传到ftp
查看>>
uTenux-OS-Task再探
查看>>
git
查看>>
#备注贴# 关于Java保真压缩的问题
查看>>
程序员50题(JS版本)(五)
查看>>
phpRedisAdmin安装
查看>>