线段树 单点更新
Exe.Time:2125MS 和 Exe.Memory:6360K 让我很伤心!
线段树功能:
Build 构建线段树
Update 替换某一点的值
Query 区间求最大值
注意:
在输入操作类型U或者Q时,注意字符输入处理。
AC代码:
#include <stdio.h> #include <string.h> #include <math.h> using namespace std; #define MAXN 200005 struct SegmentTree { int l; int r; int Max; }a[MAXN*3]; int get_max(int a, int b) { return a>b?a:b; } void Build(int s, int t, int rt) { a[rt].l = s; a[rt].r = t; a[rt].Max = -1; int mid = (a[rt].l+a[rt].r)/2; if(s == t) return ; Build(s, mid, rt*2); Build(mid+1, t, rt*2+1); } void Update(int i, int tmp, int rt) { if(a[rt].l == a[rt].r && a[rt].l == i) { a[rt].Max = tmp; return ; } int mid = (a[rt].l+a[rt].r)/2; if(i <= mid) Update(i, tmp, rt*2); else Update(i, tmp, rt*2+1); a[rt].Max = get_max(a[rt*2].Max, a[rt*2+1].Max); } int ans; void Query(int l, int r, int rt) { if(a[rt].l == l && a[rt].r == r) { ans = get_max(a[rt].Max, ans); return ; } int mid = (a[rt].l+a[rt].r)/2; if(r <= mid) Query(l, r, rt*2); else if(l > mid) Query(l, r, rt*2+1); else { Query(l, mid, rt*2); Query(mid+1, r, rt*2+1); } } int main() { int n, m, x, a, b; char c[3]; while(scanf("%d%d", &n, &m)!=EOF) { Build(1, n, 1); for(int i = 1; i <= n; i++) { scanf("%d", &x); Update(i, x, 1); } for(int i = 0; i < m; i++) { scanf("%s%d%d", c, &a, &b); if(c[0] == 'U') { Update(a, b, 1); } else { if(a > b) { int t; t = a; a = b; b = t; } ans = 0; Query(a, b, 1); printf("%d\n", ans); } } } return 0; }