HDU 1754 I hate it 分段树Segment Tree题解

给出一段数据,然后要更新单个数据,会询问一段数据中的最大值。

又是一道分段树操作。渐渐熟手了。

#pragma once
#include <cstdio>
#include <algorithm>
using namespace std;

class IHateIt_1754_1
{
	static const int SIZE = 200001;
	int *segTree;	//不要使用segTree[SIZE<<2]

	inline int lChild(int r) { return r<<1; }
	inline int rChild(int r) { return r<<1|1; }

	void pushUp(int rt)
	{
		segTree[rt] = max(segTree[lChild(rt)], segTree[rChild(rt)]);
	}

	void build(int l, int r, int rt)
	{
		if (l == r)
		{
			scanf("%d", &segTree[rt]);
			return ;
		}
		int m = l + ((r-l)>>1);
		build(l, m, lChild(rt));
		build(m+1, r, rChild(rt));
		pushUp(rt);
	}

	void update(const int stu, const int score, int l, int r, int rt)
	{
		if (l == r)
		{
			segTree[rt] = score;
			return ;
		}

		int m = l + ((r-l)>>1);
		if (stu <= m) update(stu, score, l, m, lChild(rt));
		else update(stu, score, m+1, r, rChild(rt));
		pushUp(rt);
	}

	int query(const int L, const int R, int l, int r, int rt)
	{
		if (L <= l && r <= R) return segTree[rt];

		int m = l + ((r-l)>>1);
		int res = 0;

		if (L <= m) res = query(L, R, l, m, lChild(rt));//注意下标
		if (R > m) res = max(res, query(L, R, m+1, r, rChild(rt)));
		return res;
	}
public:
	IHateIt_1754_1() : segTree((int *) malloc (sizeof(int) * (SIZE<<2)))
	{
		int N, M;
		while (scanf("%d %d", &N, &M) != EOF)
		{
			build(1, N, 1);
			while (M--)
			{
				char op[2];
				int a, b;
				scanf("%s%d%d", op, &a, &b);
				if (op[0] == 'U') update(a, b, 1, N, 1);
				else printf("%d\n",query(a, b, 1, N, 1));
			}
		}
	}
	~IHateIt_1754_1()
	{
		if (segTree) free(segTree);
	}
};

HDU 1754 I hate it 分段树Segment Tree题解

时间: 2024-10-10 06:59:52

HDU 1754 I hate it 分段树Segment Tree题解的相关文章

hdu 1754 I Hate It 线段树 点修改

// hdu 1754 I Hate It 线段树 点修改 // // 不多说,裸的点修改 // // 继续练 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <complex> #i

hdu 1754 I Hate It 线段树单点更新和区间求和

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 参照HH大牛写的额! Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多

HDU 3911 Black And White 分段树 题解

Problem Description There are a bunch of stones on the beach; Stone color is white or black. Little Sheep has a magic brush, she can change the color of a continuous stone, black to white, white to black. Little Sheep like black very much, so she wan

hdu 1754 I Hate It 线段树 点改动

// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits> #include <cmath> #include <complex> #i

HDU 1754 I Hate It(线段树)

Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目. 学生ID编号分别从1编到N. 第二

HDU 1166 敌兵布阵 Segment Tree题解

本题是最基本的分段树操作了.或者一般叫线段树,不过好像和线段没什么关系,只是分段了. 不使用lazy标志,更新只是更新单点. 如果不使用分段树,那么更新时间效率只需要O(1),使用分段树更新效率就需要O(lgn)了. 但是不是用分段树,那么查询的时间效率是O(n),而分段树查询效率是O(lgn) 这就是amortize分摊了时间,而且lgn真的很快,数据不是非常巨大的时候,接近常数了. 故此本题需要使用分段树. #include <cstdio> class EnemyInfo { stati

线段树(segment tree)

1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即"子数组"),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度. 使用线段树可以

线段树(Segment Tree)(转)

原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即

HDU 1754 I Hate It(线段树之单点更新,区间最值)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 70863    Accepted Submission(s): 27424 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的