hdu1754 线段树
来源:互联网 发布:淘宝店铺月销量怎么看 编辑:程序博客网 时间:2024/06/08 06:45
什么都不说了,贴代码,理解的时候画个树来理解理解就好了,这个也是典型的牺牲空间复杂度来缩短时间复杂度的典型算法。。。。
还是附点图上来吧。。。。。鼠标画的,见谅
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#define maxn 200005using namespace std;int a[maxn * 4];void build(int left, int right, int root){ if(left == right) scanf("%d", &a[root]); else { int mid = (left + right) / 2; build(left, mid, root * 2); build(mid + 1, right, root * 2 + 1); a[root] = max(a[root * 2], a[root * 2 + 1]); }}void up(int x, int y, int left, int right, int root){ if(left == right) a[root] = y; else { int mid = (left + right) / 2; if(x <= mid) up(x, y, left, mid, root * 2); else up(x, y, mid + 1, right, root * 2 + 1); a[root] = max(a[root * 2], a[root * 2 + 1]); }}int query(int x, int y, int left, int right, int root){ if(x <= left && y >= right) return a[root]; else { int sum = 0; int mid = (left + right) / 2; if(x <= mid) sum = max(sum, query(x, y, left, mid, root * 2)); if(y > mid) sum = max(sum, query(x, y, mid + 1, right, root * 2 + 1)); return sum; }}int main(){ int m, n; while(scanf("%d%d", &n, &m) != EOF) { build(1, n, 1); int x, y; char c; for(int i = 1; i <= 10; i ++) cout << a[i] << endl; getchar(); while(m --) { scanf("%c %d %d", &c, &x, &y);// cout << c << ' ' << x << ' ' << y << endl; getchar(); if(c == 'Q') cout << query(x, y, 1, n, 1) << endl; else up(x, y, 1, n, 1); } memset(a, 0, sizeof(a)); } return 0;}
0 0
- HDU1754 线段树入门
- hdu1754 线段树
- hdu1754线段树入门
- hdu1754之线段树
- 线段树-HDU1754
- hdu1754(线段树)
- hdu1754 线段树
- hdu1754线段树
- hdu1754(线段树)
- hdu1754(线段树)
- HDU1754(线段树)
- Hdu1754【线段树】
- HDU1754 线段树
- HDU1754线段树
- hdu1754(线段树)
- HDU1754 线段树
- hdu1754线段树入门
- HDU1754 - 线段树 Water~
- 获取Wifi相关信息
- php5.3非线程安全下载-win
- linux c++ 管道操作
- PreferenceActivity详解
- 算法导论学习笔记-5.4 概率分析和指示器随机变量的应用-几个有趣的问题
- hdu1754 线段树
- 代码大全的“变量命名的力量”总结
- C# Java间进行RSA加密解密交互(二)
- 推荐三款强大且漂亮的统计图控件
- P2Pool linux下安装运行
- 并发语言
- Mybatis入门
- 数据存储(一)--SharedPreferences之你不知道的事
- Java线程池