本文主要是介绍HDU 1754 I Hate It(区间最值问题线段树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:[kuangbin带你飞]专题七 线段树 B - I Hate It
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
题意
Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
Output
对于每一次询问操作,在一行里面输出最高成绩。
思路
裸的模版题,线段树求解区间最值。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>using namespace std;const int N = 200009;
const int MAX = N*3;
int Sum[MAX];void build(int l, int r, int k)
{if(l == r){scanf("%d", &Sum[k]);return;}int mid = (l+r)>>1;build(l, mid, k<<1);build(mid+1, r, k<<1 | 1);Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}void update(int l, int r, int pos, int d, int k)
{if(l == r){Sum[k] = d;return;}int mid = (l+r)>>1;if(pos<=mid)update(l, mid, pos, d, k<<1);elseupdate(mid+1, r, pos, d, k<<1 | 1);Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}int find(int l, int r, int tol, int tor, int k)
{if(tol <= l && tor >= r)return Sum[k];int mid = (l+r)>>1;int ans = 0;if(tol <= mid)ans = max(ans, find(l, mid, tol, tor, k<<1));if(tor > mid)ans = max(ans, find(mid+1, r, tol, tor, k<<1 | 1));return ans;
}int main()
{ios_base::sync_with_stdio(false);int n, m;while(~scanf("%d%d", &n, &m)){build(1, n, 1);char str[10];int i, j;while(m--){scanf("%s%d%d", str, &i, &j);if(str[0] == 'U')update(1, n, i, j, 1);elseprintf("%d\n" ,find(1, n, i, j, 1));}}return 0;
}
这篇关于HDU 1754 I Hate It(区间最值问题线段树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!