HDU1754 I Hate It 线段树 区间更新 区间查找 最大值

一看基本就是线段树的题目,考察的是区间更新 和区间查找,


#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>

#define ll long long

#define eps 1e-7

#define inf 0xfffffff
const ll INF = 1ll<<61;

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
//


typedef struct {
	int l,r;
	int maxn;
}Node;

int n,m;
int num[200000 + 5];
Node tree[200005 * 20];

int build(int root,int left,int right) {
	int mid;
	tree[root].l = left;
	tree[root].r = right;
	if(left == right)
		return tree[root].maxn = num[left];
	mid = (left + right)/2;
	int x = build(2 * root,left,mid);
	int y = build(2 * root + 1,mid+1,right);
	return tree[root].maxn = max(x,y);
}

int find(int root,int left,int right) {//查找操作
	int mid;
	if(tree[root].l > right || tree[root].r < left)
		return 0;
	if(left <= tree[root].l && tree[root].r <= right)
		return tree[root].maxn;
	int x = find(2 * root,left,right);
	int y = find(2 * root + 1,left,right);

	return max(x,y);

}

int update(int root,int pos,int val) {//区间更新
	if(pos < tree[root].l || tree[root].r < pos)
		return tree[root].maxn;
	if(tree[root].l == pos && tree[root].r == pos)
		return tree[root].maxn = val;
	int x = update(2 * root,pos,val);
	int y = update(2 * root + 1,pos,val);
	tree[root].maxn = max(x,y);
	return tree[root].maxn;
}

int main() {
	char c;
	int x,y;
	while(scanf("%d %d",&n,&m) == 2) {
		for(int i=1;i<=n;i++)
			scanf("%d",&num[i]);
		build(1,1,n);
		for(int i=1;i<=m;i++) {
			getchar();
			scanf("%c %d %d",&c,&x,&y);
			if(c == ‘Q‘)
				printf("%d\n",find(1,x,y));
			else {
				num[x] = y;
				update(1,x,y);
			}
		}
	}
	return EXIT_SUCCESS;
}


HDU1754 I Hate It 线段树 区间更新 区间查找 最大值

上一篇:POJ3468 A Simple Problem with Integers 线段树 区间成段更新+区间求和


下一篇:flume-ng-extends