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. HTML innerHTML、textContext、innerText

    网址 : https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML 1.innerHTML : 获得.修改元素的用HTML语 ...

  2. ndnsim结果分析

    ndnSIM中提供了几种trace用来对仿真结果进行跟踪,生成数据文件txt 官网地址: https://ndnsim.net/current/metric.html#packet-trace-hel ...

  3. opencv::图像矩(Image Moments)

    矩的概念介绍 1.几何矩 2.中心距 3.中心归一化距 4.图像中心Center(x0, y0) 计算矩 moments( InputArray array, // 输入数据 bool binaryI ...

  4. 如何把应用程序移植到k8s

    程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准.一般的应用程序是不能直接拿来部署到容器 ...

  5. 使用 pdf.js 在网页中加载 pdf 文件

    在网页中加载并显示PDF文件是最常见的业务需求.例如以下应用场景:(1)在电商网站上购物之后,下载电子发票之前先预览发票.(2)电子商务管理系统中查看发布的公文,公文文件一般是PDF格式的文件. 目前 ...

  6. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  7. Vue 的准备

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

  8. 认证授权-学习笔记1-OAuth 2.0

    简介 客户端必须得到用户的授权(authorization grant),才能获得令牌(access token).OAuth 2.0定义了四种授权方式. 授权码模式(authorization co ...

  9. 数据结构(三十三)最小生成树(Prim、Kruskal)

    一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...

  10. 如何学好javascript

    今天逛论坛时看到有朋友问,是否有专门教Javascript的学校,这里想想把自己的一点建议和自己3年来的前端Javascript开发的经验跟大家分享下,也给出几本个人认为不错的书来做为大家学习的参考资 ...