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 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...
随机推荐
- 沈向洋|微软携手 OpenAI 进一步履行普及且全民化人工智能的使命
OpenAI 进一步履行普及且全民化人工智能的使命"> 作者简介 沈向洋,微软全球执行副总裁,微软人工智能及微软研究事业部负责人 我们正处于技术发展历程中的关键时刻. 云计算的强大计算 ...
- AI入门之KNN算法学习
一.什么是KNN算法 kNN(k-NearestNeighbor),也就是k最近邻算法.顾名思义,所谓K最近邻,就是k个最近的邻居的意思.也就是在数据集中,认为每个样本可以用离他最距离近的k个邻居来代 ...
- linux svn 安装(支持http访问)
1.安装svn yum install -y subversion 2.查看svn版本 svn --version 3.创建仓库 mkdir -p /opt/java/repos cd /opt/ja ...
- 【WPF学习】第五十七章 使用代码创建故事板
在“[WPF学习]第五十章 故事板”中讨论了如何使用代码创建简单动画,以及如何使用XAML标记构建更复杂的故事板——具有多个动画以及播放控制功能.但有时采用更复杂的故事板例程,并在代码中实现全部复杂功 ...
- spring boot 整合elasticsearch
1.导入jar包 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...
- Oracle - 坏块修复(一)
一.概述 本文将介绍如何模拟坏块,以及出现坏块该如何修复.实验分为以下几个步骤. 1. 表出现坏块 2. 索引出现坏块 二.环境准备 本实验都是在oracle 11G归档模式下进行. 1. 准备相关表 ...
- SpringBoot框架——从SpringBoot看IoC容器初始化流程之方法分析
目录 一.概观Spring Boot 二.Spring Boot应用初始化 2.1 初始化入口 2.2 SpringApplication的run方法 2.3 方法分析 三.容器创建与初始化 3.1 ...
- Flask 使用pycharm 创建项目,一个简单的web 搭建
1:新建项目后 2:Flask web 项目重要的就是app 所有每个都需要app app=Flask(__name__) 3:Flask 的路径是有app.route('path')装饰决定, ...
- C++ 随笔练习 求和
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int ...
- (转)bss段和.data的是是非非
原文地址:http://zqwt.012.blog.163.com/blog/static/12044684201101214457186/ 一般情况下,一个程序本质上都是由 bss段.data段.t ...