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的任务就是要监视这些工兵营地的活动情况 ...
随机推荐
- AWD攻防工具脚本汇总(一)
最近工作很忙 今天抽空准备下AWD比赛得攻防工具和脚本 以下只是常用 希望下周不被吊锤~~ 后续整理后想抽空写成一个攻击框架汇总放github~~ 这里从各种情景和需求中去总结工具和脚本的使用 情 ...
- [NOIp2013] luogu P1970 花匠
scy居然开网了. 题目描述 你有一个序列 aaa,你需要保留尽量多的数,使得剩下的数满足以下条件中的一个: ∀x∈[2,n−1]∩N∗\forall x\in[2,n-1]∩\N^*∀x∈[2,n− ...
- [洛谷P2396]yyy loves Maths VII $\&$ [CF327E]Axis Walking
这道题是一个状压动归题.子集生成,每一位表示是否选择了第$i$个数. 转移:$f[S] = \sum f[S-\{x\}]$且$x\in S$,当该子集所有元素的和为$b_1$或$b_2$时不转移. ...
- Charles抓包工具的使用(一)
前提:charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在W ...
- dig-基本使用
dig:Domain Information Groper,是一个DNS查询工具 1:使用google的域名服务器:查询特定域名的A记录 [root@localhost ~]# dig @8.8.8. ...
- BOOL,int,float,指针变量 与“零值”比较的if语句
分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var) 解答: BOOL型变量:if(!var) int型变量: if(var==0) float型变量: ...
- Jquery动态bind绑定已有函数,函数自动执行的问题解决方法
在bind后面的方法,不能带括号,带括号函数就自动执行了... <script> //通过子元素删除某行 function deleteRow() { var flag = confirm ...
- 配置Docker镜像加速
1.在docker toolbox执行下面的命令进入VM bash docker-machine ssh default 2.执行下面的命令修改profile文件: sudo vi /var/lib/ ...
- 使用Spring Data JPA进行数据分页与排序
一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控 ...
- 学习笔记02form
1.<form>为表单标签*如果要把数据提交到服务器,则需要将<input> <textarea> <select>等表单元素放到<from> ...