hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 93269 Accepted Submission(s): 35359
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
Hint
Huge input,the C function scanf() will work better than cin
PS:通过ios::sync_with_stdio(false);可以加快数据cin、cout的输入输出
分析:
如果直接在每一步进行遍历求最大值,时间复杂度为O(n*m),所以考虑数据结构中的线段树
算法模板 (线段树)(1、build_tree(int i, int l, int r);2、update_tree(int r);3、query_tree(int i, int l, intr)):
void build_tree(int i, int l, int r)
{
node[i].l = l;
node[i].r = r;
node[i].value = ;
if (l == r)
{
pre[l] = i;
return ;
}
build_tree (i <<, l, (int)(floor(l+r)/2.0));
build_tree ((i <<) + , (int)(floor(l+r)/2.0)+, r);
} void update_tree(int r)
{
if (r == ) return ;
int f = r / ;
int a = node[f>>].value;
int b = node[(f>>)+].value;
node[f].value = max(a, b);
update_tree(f);
} void query_tree(int i, int l, int r)
{
if (node[i].l == l && ndoe[i].r == r)
{
ans = max(ans, node[i].value);
return ;
}
i = i<<;
if (l <= node[i].r)
{
if (r <= node[i].r) query_tree(i, l, r);
else query_tree(i, l, node[i].r);
}
++ i;
if (r >= node[i].l)
{
if (l >= node[i].l) query_tree(i, l, r);
else query_tree(i, node[i].l, r);
}
}
C/C++代码实现(AC):
#include <bits/stdc++.h> using namespace std; const int MAXNODE = <<;
const int MAXN = 2e6 + ;
int pre[MAXN], n, m, temp, ans; struct node
{
int l, r, value;
}P[MAXNODE]; void build_tree(int i, int l, int r)
{
P[i].l = l;
P[i].r = r;
P[i].value = ;
if (l == r)
{
pre[l] = i;
return ;
}
build_tree(i<<, l, (int)(floor(l + r) / 2.0));
build_tree((i<<) + , (int)(floor(l + r) / 2.0) + , r);
} void update_tree(int r)
{
if (r == ) return ;
int f = r / ;
int a = P[f<<].value;
int b = P[(f<<)+].value;
P[f].value = max(a, b);
update_tree(f);
} void query_tree(int i, int l, int r)
{
if (P[i].l == l && P[i].r == r)
{
ans = max(ans, P[i].value);
return ;
}
i = i <<;
if (l <= P[i].r)
{
if (r <= P[i].r) query_tree(i, l, r);
else query_tree(i, l, P[i].r);
}
i ++;
if (r >= P[i].l)
{
if (l >= P[i].l) query_tree(i, l, r);
else query_tree(i, P[i].l, r);
}
} int main()
{
ios::sync_with_stdio(false);
while(cin >>n >>m)
{
build_tree(, , n);
for(int i = ; i <= n; ++i)
{
cin >>temp;
P[pre[i]].value = temp;
update_tree(pre[i]);
}
int a, b;
char op;
while(m --)
{
ans = ;
cin >>op >>a >>b;
if (op == 'Q')
{
query_tree(, a, b);
cout <<ans <<endl;
}
else
{
P[pre[a]].value = b;
update_tree(pre[a]);
}
}
}
return ;
}
hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)的更多相关文章
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- HDU 1754 I Hate It 线段树(单点更新,成段查询)
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: #include<iostream> ...
- hdu 1754 I Hate It 线段树 单点更新 区间最值
线段树功能:update:单点更新 query:区间最值 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define r ...
- HDU 1754 I Hate It 线段树 单点更新 区间最大值
#include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
随机推荐
- C++ 利用template给函数中的变量赋初值
#include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...
- stm32cubeMX配置LWIP
MCU:stm32f769NIHx PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...
- amoeba-mysql
配置完成后无法连接 Could not create a validated object, cause: ValidateObject failed 查看logs/下面的 messageHandle ...
- FastDFS集群-安装说明
一.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线 ...
- 使用 statcounter 统计 Hexo 博客访问量
介绍 statcounter是一个提供网站访问统计服务的网站: StatCounter is a simple but powerful real-time web analytics service ...
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
- 4. SOFAJRaft源码分析— RheaKV初始化做了什么?
前言 由于RheaKV要讲起来篇幅比较长,所以这里分成几个章节来讲,这一章讲一讲RheaKV初始化做了什么? 我们先来给个例子,我们从例子来讲: public static void main(fin ...
- Vue 的准备
## .es6的基本语法 let---是局部作用于,不会存在变量提升,变量不能重复声明 const--局部作用域,不会存在变量提升 不能重复声明,只声明常亮,不可变的量 ```javasc ...
- 记录一次诡异的Maven Profile不生效的问题
记录一次诡异的Maven Profile不生效的问题 现象 maven 打包之后,复制的 profile对应的resource文件总是不正确的. 即便是加了 mvn clean package -P ...
- SpringData-Redis发布订阅自动重连分析
SpringData-Redis发布订阅自动重连分析 RedisMessageListenerContainer 配置 @Bean @Autowired RedisMessageListenerCon ...