HUD_1745 I Hate It!【线段树】【最值查询修改】
来源:互联网 发布:域名系统dns的作用 编辑:程序博客网 时间:2024/05/17 00:04
Problem Description:
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input:
本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。学生ID编号分别从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output:
对于每一次询问操作,在一行里面输出最高成绩。
Sample Input:
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
Sample Output:
5659
Hint:
Huge input,the C function scanf() will work better than cin
#include <iostream>#include <algorithm>#include <cstring>#define MAX 200000using namespace std;struct Tree{ int l; int r; int v;};Tree tree[MAX << 2];void pushup(int rt){ //在所有更改节点值的操作后记得pushup。 tree[rt].v = max(tree[rt << 1].v , tree[rt << 1 | 1].v);}void Buildtree(int l, int r, int rt){ tree[rt].l = l; tree[rt].r = r; if(r == l){ scanf("%d", &tree[rt].v); return; } int mid = (l + r) >> 1; Buildtree(l, mid, rt << 1); Buildtree(mid + 1, r, rt << 1 | 1); pushup(rt);}void updata( int rt, int k, int i){ if(tree[rt].l == tree[rt].r){ //更新到叶子结点听就可以了,显而易见这个节点一定是被查询的节点 tree[rt].v = i; return; //cout << "tree[" << rt << "].v : " << i << endl; } int mid = (tree[rt].l + tree[rt].r) >> 1; if(k <= mid) //这个查询节点如果在区间左半边就去左半边找 要么就去右半边 updata(rt << 1, k, i); else updata(rt << 1 | 1, k, i); pushup(rt);//因为更改了数值所以pushup一下}int quary( int l, int r, int rt ){ if(l <= tree[rt].l && tree[rt].r <= r){ //注意这里的包含关系 自己傻逼的写反了。 return tree[rt].v; } int maxn = 0;//这个maxn要在这里写。在外面不知道可不可以 int mid = (tree[rt].r + tree[rt].l) >> 1; //注意这里的写法。 if(l <= mid) //左区间未覆盖完 maxn = max(quary(l, r, rt << 1), maxn); if(r > mid) //右区间未覆盖完 maxn = max(quary(l, r, rt << 1 | 1), maxn); return maxn;//要有返回值}int main() { int n,q; while(~scanf("%d %d", &n, &q)){ Buildtree(1, n, 1); for(int i = 0; i < q; i++){ char c; int a,b; scanf("%s %d %d",&c, &a, &b); //cout << " " << c << " " << a << " " <<b <<endl; if(c == 'Q'){ printf("%d\n", quary(a, b, 1)); } else if(c == 'U'){ updata( 1, a, b); } } } return 0;}/* 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5 */
0 0
- HUD_1745 I Hate It!【线段树】【最值查询修改】
- 线段树-点修改--点查询--最值查询 Hdu 1754I Hate It
- hdu 1754 I Hate It【线段树】 区间修改,最值查询
- HDU 1754 I Hate It 线段树(点修改+最值查询)
- I Hate It【线段树 最值】
- 线段树系列-hdu-1754-I Hate It-单点修改求区间最值
- hdu1754 I Hate It(线段树单点修改,区间最值)
- HDU 1754 I Hate It(线段树,最值查询)
- HDU 1754 I Hate It(线段树单点更新区间最值查询)
- hdu1754 I Hate It 线段树求区间最值
- HDU1754 I Hate It 线段树区间最值
- hdu 1754 I Hate It 线段树-区间最值
- HDU-1754I Hate It 线段树区间最值
- 【线段树I:点修改+区间查询】hdu 1754 I Hate It
- hdu1754 I Hate It (线段树点修改查询模版题)
- 线段树(区间最大值查询和点修改)——I Hate It ( HDU 1754 )
- (HDU 1754)I Hate It 线段树区间查询入门,单点修改
- HDU-1754 I Hate It (线段树 入门题 点修改 区间查询)
- 模拟生产环境使用thrift c++版
- Proteus仿真AT89C52——秒表
- modbus-tcp协议学习-python
- 解题报告:51nod 1686 第K大区间 二分+尺取
- IT痴汉的工作现状47-兄弟,哥也只能帮到这了
- HUD_1745 I Hate It!【线段树】【最值查询修改】
- Qt::WA_DeleteOnClose 造成的野指针问题
- Git指令
- soapUI测试webservice(参数为xml格式的处理方式)
- Java 多态性理解
- 蚁群算法理论
- canvas游戏学习笔记(一)
- 方法参数传递
- 第二章 Java内存区域与内存溢出异常