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 RMQ问题再临-线段树

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

hihocoder 1077线段树

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

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

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

hihoCoder 1077 RMQ问题再临-线段树

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

hihocoder 1080 更为复杂的买卖房屋姿势 线段树

传送门:hihocoder 1080 给定一个长度为n的数组,有两种操作: (1)对范围[l,r]内的数都加上x(x可为负) (2)把范围[l,r]内的数都变成x 问每一步操作后整个数组的和为...

hihoCoder 1078 线段树的区间修改

#include #include #include #define N 1000005 using namespace std; int n,m; int a[N]; struct node...

hihocoder 1078# 线段树的区间修改模版

#include #include #include #include #include #include #include #include #include #include #include #...

hihoCoder - 1116 - 计算 (线段树)

计算题目传送:#1116 : 计算AC代码:#include #include #include #include #include #include #include #include...

hihoCoder 1078 线段树的区间修改

还是最基础的线段树噢  这次是区间修改 #include #include #include #define lc p<<1,s,mid #define rc p<<1|1,mid+1,e #def...
  • acvay
  • acvay
  • 2014-12-11 12:39
  • 792

hihocoder1078 线段树的区间修改

线段树
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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