有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴!
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
参考资料:
https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html
在这个题目中原做法是他们的题目次数储存在数组中,后每一次查询时枚举,时间复杂度为o(N);建立表的时候时间复杂度也为o(N)
操作耗时,采用线段树能储存每一个区间的信息,而不仅仅是单个的信息,所需时间复杂度为o(log(n))
以下采用Java实现:
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
private Tree[] build(Tree[] trees, int l, int r, int k){
Tree tree = new Tree();
trees[k] = tree;
tree.l = l;
tree.r = r;
if(l==r){
tree.w = sc.nextInt();
return trees;
}
int m = (l+r)/2;
trees = build(trees, l, m, 2*k);
trees = build(trees, m+1, r, 2*k+1);
trees[k].w = Math.max( trees[2*k].w, trees[2*k+1].w);
return trees;
}
private int queryMaxW(int max,int k,Tree[] trees,int l, int r){
int m = -1;
if(l == trees[k].l && r == trees[k].r){
m = trees[k].w;
}
else{
int mid = (trees[k].l + trees[k].r)/2;
if(l>mid){
m = queryMaxW(max, k*2+1, trees, l, r);
}
else if(r<=mid){
m = queryMaxW(max, k*2, trees, l, r);
}
else {
if(l==r&&l==mid)
m = trees[k*2].w;
else{
int m1 = queryMaxW(max, k*2, trees, l, mid);
int m2 = queryMaxW(max, k*2+1, trees, mid+1, r);
m = m1>m2?m1:m2;
}
}
}
return max>m?max:m;
}
public Tree[] updataEle(Tree[] trees, int l, int r, int k, int val){
if(l == trees[k].l && r == trees[k].r ){
trees[k].w = val;
return trees;
}else {
int mid = (trees[k].l + trees[k].r)/2;
if(r<=mid){
trees=updataEle(trees,l,r,k*2,val);
}
else if(l>mid){
trees=updataEle(trees,l,r,k*2+1,val);
}
trees[k].w = Math.max(trees[2*k].w,trees[2*k+1].w);
}
return trees;
}
public static void main(String[] args){
Tree[] trees = new Tree[500003];
Main main = new Main();
while(sc.hasNext()){
int PN = sc.nextInt();
int ON = sc.nextInt();
trees = main.build(trees, 1, PN, 1);
while(ON-->0){
String does = sc.next();
if(does.equals("Q")){
int l = sc.nextInt();
int r = sc.nextInt();
int max = main.queryMaxW(-1, 1, trees, l, r);
System.out.println(max);
}else if(does.equals("U")){
int x = sc.nextInt();
int v= sc.nextInt();
trees = main.updataEle(trees, x, x, 1, v);
}
}
}
}
}
class Tree{
public int l,r,w;
Tree(){
super();
}
}