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 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9

分析

  今天突然想起我ST表还不会打,所以打算找一个区间最大值来做,于是就有了这道题,但我做的时候,突然好奇树状数组能不能来干这件事,想了想,魔改了一下代码,然后发现一直改不对,然后就去百度了一下,发现对于单点修改的问题,树状数组还是可以解决的,不必建立线段树。

  对于修改,如果把所有的点都重新计算一边,固然可以,但是效率太低,所以考虑树状数组的特有性质,对于一个点,只有距离在lowbit之内的点才能影响到它,比如点5,lowbit5=1,故只有自己影响自己,而4呢,lowbit4=4,所以影响它的点有1,2,3,而3=4-1,2=4-2,1还用不用考虑呢?显然是不用的,因为1是2的儿子,在修改2的时候便已经考虑过1了,所以只需一个循环套循环就能解决这个问题。

  对于查询,求区间加法的时候可以进行加减,但最大值显然不行,所以考虑别的查询方法。如果查询区间[l,r]的话,那么如果r-lowbit(r)>l,说明r的范围不包括l,所以可以将这个区间分成两部分[r-lowbit r+1,r]

和区间[l,r-lowbit r],而前者就恰好是tree[r],可以自行取值验证,如果r-lowbit(r)<l呢,说明r的范围已经包括了l,那么就将这个区间分为两部分,a[r]和[l,r-1],然后再递归查询就行,你会发现递归是没有终点的,会死循环,所以要加一个终点,终点显然就是l==r,这样的话区间就只包括a[r]了,所以直接返回a[r]的值,这样就完成了树状数组的区间最大值查询,区间最小值也是一样的道理,换一下函数名就行了,是不是很神奇呢?

  于是就掌控了一门神奇的技能,于是我还是没练习ST表,算了晚上再弄吧

  

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+;
int lowbit(int x){
return x&-x;
}
int tmx[N],a[N],n;
void Add(int x){
while(x<=n){
tmx[x]=a[x];
int lim=lowbit(x);
for(int i=;i<lim;i<<=){
tmx[x]=max(tmx[x],tmx[x-i]);
}
x+=lowbit(x);
}
}
int query(int l,int r){
if(l==r)return a[l];
if(r-lowbit(r)>l)return max(tmx[r],query(l,r-lowbit(r)));
else return max(a[r],query(l,r-));
}
int main(){
int m;
while(~scanf("%d%d",&n,&m)){
memset(tmx,,sizeof(tmx));
for(int i=;i<=n;i++)
scanf("%d",&a[i]),Add(i);
while(m--){
char op[];int l,r;
scanf("%s%d%d",op,&l,&r);
if(op[]=='Q')printf("%d\n",query(l,r));
else {
a[l]=r;
Add(l);
}
}
}
return ;
}

HDU 1754 I hate it 树状数组维护区间最大值的更多相关文章

  1. 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】

    任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...

  3. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 【树状数组维护区间最大值】

    题目传送门:http://codeforces.com/contest/799/problem/C C. Fountains time limit per test 2 seconds memory ...

  4. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  5. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  6. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  7. hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组

    题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...

  8. hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化

    题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...

  9. 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)

    [题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...

随机推荐

  1. 沈向洋|微软携手 OpenAI 进一步履行普及且全民化人工智能的使命

    OpenAI 进一步履行普及且全民化人工智能的使命"> 作者简介 沈向洋,微软全球执行副总裁,微软人工智能及微软研究事业部负责人 我们正处于技术发展历程中的关键时刻. 云计算的强大计算 ...

  2. AI入门之KNN算法学习

    一.什么是KNN算法 kNN(k-NearestNeighbor),也就是k最近邻算法.顾名思义,所谓K最近邻,就是k个最近的邻居的意思.也就是在数据集中,认为每个样本可以用离他最距离近的k个邻居来代 ...

  3. linux svn 安装(支持http访问)

    1.安装svn yum install -y subversion 2.查看svn版本 svn --version 3.创建仓库 mkdir -p /opt/java/repos cd /opt/ja ...

  4. 【WPF学习】第五十七章 使用代码创建故事板

    在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...

  5. spring boot 整合elasticsearch

    1.导入jar包 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...

  6. Oracle - 坏块修复(一)

    一.概述 本文将介绍如何模拟坏块,以及出现坏块该如何修复.实验分为以下几个步骤. 1. 表出现坏块 2. 索引出现坏块 二.环境准备 本实验都是在oracle 11G归档模式下进行. 1. 准备相关表 ...

  7. SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析

    目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...

  8. Flask 使用pycharm 创建项目,一个简单的web 搭建

    1:新建项目后 2:Flask web 项目重要的就是app 所有每个都需要app app=Flask(__name__)   3:Flask 的路径是有app.route('path')装饰决定, ...

  9. C++ 随笔练习 求和

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int ...

  10. (转)bss段和.data的是是非非

    原文地址:http://zqwt.012.blog.163.com/blog/static/12044684201101214457186/ 一般情况下,一个程序本质上都是由 bss段.data段.t ...