hdu 1754 I Hate It 线段树
2018-03-19 15:11
344 查看
给你N个数,M个操作,操作分两类。(1)"QAB“,查询区间[A,B]内的最大值。(2)"UAB",将第A个数的值改成B。
[align=left]Input[/align]本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 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。 [align=left]Output[/align]对于每一次询问操作,在一行里面输出最高成绩。 [align=left]Sample Input[/align]5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5 [align=left]Sample Output[/align]5 6 5 9HintHuge input,the C function scanf() will work better than cin线段树,更新节点,区间求最值思路:这个题完全是线段树的一个基础应用,就是建一个静态树,然后不根据输入区维护各个区间上的最值。用到了三个基本操作,建树,更新,查询。
[align=left]Input[/align]本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 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。 [align=left]Output[/align]对于每一次询问操作,在一行里面输出最高成绩。 [align=left]Sample Input[/align]5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5 [align=left]Sample Output[/align]5 6 5 9HintHuge input,the C function scanf() will work better than cin线段树,更新节点,区间求最值思路:这个题完全是线段树的一个基础应用,就是建一个静态树,然后不根据输入区维护各个区间上的最值。用到了三个基本操作,建树,更新,查询。
#include <iostream> #include <algorithm> using namespace std; int MAX[4e6+1]; void build(int l,int r,int rt) { if(l==r) { scanf("%d",&MAX[rt]); return; } int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); } void PishUp(int rt) { MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]); } viod update(int p,int q,int l,int r,int rt) { if(l==r) { MAX[rt]=q; return; } int m=(l+r)>>1; if(p<=m) { updata(p,q,l,m,rt<<1); } else { update(p,q,m+1,r,rt<<1|1); } PushUp(rt); } int getmax(int L,int R,int l,int r,int rt) { if(L<=l && r<=R) { return MAX[rt]; } int m=(r+l)>>1; int res=0; if(L<=m) { ret=max(ret,getmax(L,R,l,m,rt<<1)); if(R>m) ret=max(ret,getmax(L,R,m+1,r,(rt<<1)+1)); } } int main() { int n,m; char c; while(~scanf("%d %d",&n,&m)) { build(1,n,1); for(i=0;i<m;i++) { scanf("%*c%c%d %d",&c,&a,&b); if(c=='Q') printf("%d\n",getmax(a,b,1,n,1)); else update(a,b,1,n,1); } } }
相关文章推荐
- HDU—1754—I_Hate_It—【数据结构】【线段树】【单点更新】
- HDU 1754 I Hate It (线段树 区间最值)
- HDU 1754 I Hate It 线段树
- HDU1754-I hate it-线段树
- HDU1754——I Hate It(线段树)
- hdu 1754 I Hate It 线段树单点更新区间查询
- HDU 1754 I hate it 线段树 单点修改、最大值
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- [ACM] hdu 1754 I Hate It (线段树,单点更新)
- hdu 1754 I Hate It 线段树 单点更新 区间最值
- hdu 1754:I Hate It(线段树,入门题,RMQ问题)
- hdu 1754 I Hate It 线段树
- 线段树 hdu 1754 I Hate It 单点更新 区间求最值
- HDU 1754:I Hate It(线段树-单点更新)
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)
- HDU-1754-I hate it (线段树RMQ)
- hdu 1754 I Hate It 线段树单点更新区间查询
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- HDU-1754 I Hate It 线段树 链式
- 线段树 hdu 1754 I Hate It 单点更新 区间求最值