hihocoder 1077 线段树 java实现

原创 2016年06月01日 15:52:53

package tree;


import java.util.Scanner;


/*

 * 10

3655 5246 8991 5933 7474 7603 6098 6654 2414 884

 */

public class Week19 {

private static int dataIndex = 0;

private static int maximum = 0;


public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int nodenum = Integer.parseInt(scanner.nextLine());

String nodedata = scanner.nextLine();

node19 root = Week19.creSegTree(1, nodenum, nodedata);

int querynum = Integer.parseInt(scanner.nextLine());

for(int i=0; i<querynum; i++){

String querydata = scanner.nextLine();

int type = Integer.parseInt(querydata.split(" ")[0]);

int firstnum = Integer.parseInt(querydata.split(" ")[1]);

int secondnum = Integer.parseInt(querydata.split(" ")[2]);

if(type == 0){

query(firstnum, secondnum, root);

System.out.println(maximum);

maximum = 0;

}

if(type == 1) update(firstnum, secondnum, root);

}

}


public static node19 creSegTree(int left, int right, String data){

node19 node = new node19(left, right);

if(left != right){

node19 node1 = creSegTree(left, ((left + right) / 2), data);

node19 node2 = creSegTree(((left + right) / 2) + 1, right, data);

node.value = node1.value > node2.value ? node2.value : node1.value;

node.leftChild = node1;

node.rightChild = node2;

return node;

}

else{

node.value = Integer.parseInt(data.split(" ")[dataIndex++]);

return node;

}

}


public static void query(int firstnum, int secondnum, node19 root){

if(firstnum == root.left && secondnum == root.right){

if(maximum == 0) maximum = root.value;

else if(root.value < maximum) maximum = root.value;

}

else if(firstnum > (root.left + root.right) / 2) query(firstnum, secondnum, root.rightChild);

else if(secondnum < (root.left + root.right) / 2 + 1) query(firstnum, secondnum, root.leftChild);

else{

query(firstnum, (root.left + root.right) / 2, root.leftChild);

query((root.left + root.right) / 2 + 1, secondnum, root.rightChild);

}

}


public static void update(int firstnum, int secondnum, node19 root){

if(root.left == firstnum && root.right == firstnum) root.value = secondnum;

else if(firstnum < (root.left + root.right) / 2 + 1){ 

update(firstnum, secondnum, root.leftChild);

root.value = root.leftChild.value > root.rightChild.value ? root.rightChild.value : root.leftChild.value;

}

else if(firstnum > (root.left + root.right) / 2){ 

update(firstnum, secondnum, root.rightChild);

root.value = root.leftChild.value > root.rightChild.value ? root.rightChild.value : root.leftChild.value;

}

}

}


class node19{

int left;

int right;

int value;

node19 leftChild;

node19 rightChild;

public node19(int left, int right){

this.left = left;

this.right = right;

}


}



线段树-单点更新-hihoCoder1077

线段树线段树是一种二叉搜索树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,它基本能保持每个操作的时间复杂度为O(lgN)。假定...

hihocoder1077,线段树单点修改的一点小技巧

如果有神犇会区间修改的非递归版本,求教啊线段树单点修改,区间查询最小值 可以看见我这代码里面全是for循环 zkw 大法好正常线段树是一颗近似的满二叉树,因为n不是2的k次方 就这样凑成了一...
  • cww97
  • cww97
  • 2016年08月20日 03:23
  • 227

hihoCoder 1077 RMQ问题再临-线段树

今天把这题一做,才知道以前很多地方都用错了,杭电的数据也太水了,今天算是大彻大悟了。 #include #include #include #define N 1000005 using na...

hihocoder 1077线段树

按自己理解写了个拙劣的线段树。         内存居然用了47MB,不知道这样的程序最多在计算机里能占用多少内存 // hiho1077 segment tree #include #inclu...

hihocoder1077 RMQ问题再临-线段树

线段树描述上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并且依次标号为1到N,每次小Hi都给出一段区间[L, R],小Ho要做的是选出标号在这个区间内的所有商品重量最...

hihocoder #1077 RMQ问题再临-线段树

#1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N...

hihoCoder1079 线段树+离散化

线段树+离散化 #1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当...
  • FrankAx
  • FrankAx
  • 2017年07月22日 15:53
  • 86

hihoCoder - 1116 - 计算 (线段树区间合并)

线段树区间合并的题目套路就是每一段维护 1.当前段的答案data[k], 2.当前段所有前缀Left[k] 3.当前段所有后缀Right[k] 合并时由当前段的左右子节点的data转移当前段,...
  • Mtrix
  • Mtrix
  • 2016年09月25日 15:32
  • 337

hihoCoder1299 打折机票(线段树)

题目来源 http://hihocoder.com/problemset/problem/1299 描述 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包。经...
  • hermito
  • hermito
  • 2016年05月06日 22:32
  • 213

hihocoder1079(线段树+离散化)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB描述小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~这天小Hi和小Ho所在的学校...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hihocoder 1077 线段树 java实现
举报原因:
原因补充:

(最多只允许输入30个字)