会员
众包
新闻
博问
闪存
赞助商
HarmonyOS
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
Firecoder
博客园
首页
新随笔
联系
订阅
管理
hdu 1754 I Hate It (线段树入门题、求区间段的最大值)
http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树入门题:求区间段的最大值
#include "iostream" #include "stdio.h" using namespace std; const int MAX = 200001; int big; struct node { int r, l, max; }tree[MAX * 3]; void Create(int t, int left, int right) //建树 { tree[t].l = left; tree[t].r = right; tree[t].max = 0; if(left == right) return; int mid = (left + right) >> 1; Create(t * 2, left, mid); Create(t * 2 + 1, mid + 1, right); } void Updata(int t, int x, int val) { if(tree[t].l == x && tree[t].r == x) tree[t].max = val; else { int mid = (tree[t].l + tree[t].r) >> 1; if(x <= mid) Updata(t * 2, x, val); else Updata(t * 2 + 1, x, val); } if(tree[t].max < val) tree[t].max = val; } void FindMax(int t, int left, int right) { if(tree[t].l == left && tree[t].r == right) { if(tree[t].max > big) big = tree[t].max; return; } int mid = (tree[t].l + tree[t].r) >> 1; if(left > mid) { FindMax(t * 2 + 1, left, right); } else if(right <= mid) { FindMax(t * 2, left, right); } else { FindMax(t * 2, left, mid); FindMax(t * 2 + 1, mid + 1, right); } } int main() { int n, m, i, a, b; char ch; while(scanf("%d%d", &n, &m) != EOF) { Create(1, 1, n); for(i = 1; i <= n; i++) { cin >> a; Updata(1, i, a); } while(m--) { cin >> ch >> a >> b; if(ch == 'U') Updata(1, a, b); else { big = 0; FindMax(1, a, b); cout << big << endl; } } } return 0; }
posted @
2011-08-02 18:18
Firecoder
阅读(
130
) 评论(
0
)
收藏
举报
刷新页面
返回顶部
公告