HDU 1754 I hate it 树状数组维护区间最大值
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
Sample Output
分析
今天突然想起我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 树状数组维护区间最大值的更多相关文章
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】
任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...
- 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 ...
- bzoj 2819 Nim dfn序+树状数组维护区间异或值
题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
[题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组
题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...
- hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化
题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...
- 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)
[题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...
随机推荐
- 【教程向】配置属于自己的vim
新建Vim配置文件 Linux mkdir -/.vimrc 配置 常用设置 配置 功能 set number 设置行号 set systax on 高亮 colorscheme{主题} 设置颜色主题 ...
- 对BFC的深层理解
BFC(Block Formatting Context)块级格式化上下文 注意:BFC首先是块,其次需要具备下面的条件之一才可以(通俗来说,BFC就好比一所985或者211的高校,想要成为985或者 ...
- Java反射,泛型在Json中的运用
最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的 ...
- java单链表的实现自己动手写一个单链表
单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是 ...
- LeetCode--链表3-经典问题
LeetCode--链表3-经典问题 题1 反转链表 第一次代码超出时间限制 原因是,反转之后链表的尾部节点和头结点连上了 /** * Definition for singly-linked lis ...
- 不要忽视Managed code stripping的副作用
0x00 前言 Unity 2018.3之后,新的“Managed Stripping Level”选项将替换 player settings 中原有的“Stripping Level”选项. 这个新 ...
- 【echarts3】 折线图我踩过的那些坑 (tooltip 设置,line 单个点/散点不显示问题)
echarts 折线图小技巧 echarts 折线图功能丰富且官方文档详细易懂,上手比较容易,这篇文章将分享一些项目中踩过的坑,示例主要以多条曲线为主,对大家完成一些 曲线.tooltip 和 mar ...
- 利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
Linux:CentOS7 python: 系统默认python版本2.7,利用python启动 自己安装python版本3.8,利用python3启动 问题描述: 在上述环境中利用virtualen ...
- 利用iTunes给MP3添加专辑插图
利用iTunes给MP3添加专辑插图 打开iTunes 准备好没有专辑插图的mp3文件和插图 将准备好的mp3文件拖入iTunes 右键菜单选择专辑信息选项 在专辑信息里面选择插图 点击左下角的添加插 ...
- 【11】openlayers 地图交互
地图交互interaction 关于map的方法: //添加地图交互 map.addInteraction(interaction) //删除地图交互 map.removeInteraction(in ...