使用线段树的Java题解。
需要注意两个细节:
- 题目中说明输入有多组测试数据
- 两个整数A和B之间的大小顺序需要考虑,如果"A>B",则需要先调换位置。
代码如下:
import java.util.Scanner; class SegmentTree { private int[] data; private int[] nodes; private int len; public SegmentTree(int[] data) { this.data = data; this.len = data.length; this.nodes = new int[this.len << 2]; this.build(1, 1, data.length); } private void build(int idx, int l, int r) { if (l == r) { this.nodes[idx] = this.data[l - 1]; return; } int mid = (l + r) >> 1; this.build(idx << 1, l, mid); this.build(idx << 1 | 1, mid + 1, r); this.nodes[idx] = Math.max(this.nodes[idx << 1], this.nodes[idx << 1 | 1]); } public void update(int tIdx, int tVal) { if (tIdx <= 0 || tIdx > this.len) { return; } this._update(tIdx, tVal, 1, 1, this.len); } private void _update(int tIdx, int tVal, int idx, int l, int r) { if (l == r) { this.nodes[idx] = tVal; return; } int mid = (l + r) >> 1; if (tIdx <= mid) { this._update(tIdx, tVal, idx << 1, l, mid); } else { this._update(tIdx, tVal, idx << 1 | 1, mid + 1, r); } this.nodes[idx] = Math.max(this.nodes[idx << 1], this.nodes[idx << 1 | 1]); } public int query(int L, int R) { if (L > R) { int temp = L; L = R; R = temp; } if (L <= 0 || R > this.len) { return -1; } return this._query(L, R, 1, 1, this.len); } private int _query(int L, int R, int idx, int l, int r) { if (L == l && R == r) { return this.nodes[idx]; } int mid = (l + r) >> 1; if (R <= mid) { return this._query(L, R, idx << 1, l, mid); } else if (L > mid) { return this._query(L, R, idx << 1 | 1, mid + 1, r); } else { return Math.max(this._query(L, mid, idx << 1, l, mid), this._query(mid + 1, R, idx << 1 | 1, mid + 1, r)); } } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int N = scanner.nextInt(); int M = scanner.nextInt(); int[] data = new int[N]; for (int i = 0; i < N; i++) { data[i] = scanner.nextInt(); } SegmentTree maxTree = new SegmentTree(data); for(int i = 0; i < M; i++) { String oper = scanner.next(); int L = scanner.nextInt(); int R = scanner.nextInt(); if ("Q".equals(oper)) { System.out.println(maxTree.query(L, R)); } else if ("U".equals(oper)) { maxTree.update(L, R); } } } scanner.close(); } }