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的读取写出速度)的更多相关文章

  1. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  2. HDU 1754 I Hate It 线段树(单点更新,成段查询)

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: #include<iostream> ...

  3. hdu 1754 I Hate It 线段树 单点更新 区间最值

    线段树功能:update:单点更新 query:区间最值 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define r ...

  4. HDU 1754 I Hate It 线段树 单点更新 区间最大值

    #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...

  5. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  6. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  7. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  9. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

随机推荐

  1. C++ 利用template给函数中的变量赋初值

    #include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...

  2. stm32cubeMX配置LWIP

    MCU:stm32f769NIHx  PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...

  3. amoeba-mysql

    配置完成后无法连接 Could not create a validated object, cause: ValidateObject failed 查看logs/下面的 messageHandle ...

  4. FastDFS集群-安装说明

    一.简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线 ...

  5. 使用 statcounter 统计 Hexo 博客访问量

    介绍 statcounter是一个提供网站访问统计服务的网站: StatCounter is a simple but powerful real-time web analytics service ...

  6. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

  7. 4. SOFAJRaft源码分析— RheaKV初始化做了什么?

    前言 由于RheaKV要讲起来篇幅比较长,所以这里分成几个章节来讲,这一章讲一讲RheaKV初始化做了什么? 我们先来给个例子,我们从例子来讲: public static void main(fin ...

  8. Vue 的准备

    ## .es6的基本语法 ​ let---是局部作用于,不会存在变量提升,变量不能重复声明 ​ const--局部作用域,不会存在变量提升 不能重复声明,只声明常亮,不可变的量 ​ ```javasc ...

  9. 记录一次诡异的Maven Profile不生效的问题

    记录一次诡异的Maven Profile不生效的问题 现象 maven 打包之后,复制的 profile对应的resource文件总是不正确的. 即便是加了 mvn clean package -P ...

  10. SpringData-Redis发布订阅自动重连分析

    SpringData-Redis发布订阅自动重连分析 RedisMessageListenerContainer 配置 @Bean @Autowired RedisMessageListenerCon ...