HDU 1754 I hate it 【线段树--单点更新,区间最值】
来源:互联网 发布:淘宝星级 编辑:程序博客网 时间:2024/04/20 16:34
链接:click here~~
题意:
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
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
【解题思路】:线段树功能:update:单点替换 query:区间最值
题意:
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
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
【解题思路】:线段树功能:update:单点替换 query:区间最值
代码:
#include <iostream>#include <stdio.h>#include <map>#include <queue>#include <stack>#include <math.h>#include <set>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};#define mem(a) memset(a,0,sizeof(a))#define LL long long#define Max(a,b) a>b?a:b;#define Min(a,b) a<b?a:b;const int M=200005;#define lchild l,m,rt<<1#define rchild m+1,r,rt<<1|1int tree[M<<2];/*void Pushup(int rt) //对于区间求和{ tree[rt]=tree[rt<<1]+tree[rt<<1|1];}*/void Pushup(int rt) /*对于区间求最大值*/{ tree[rt]=Max(tree[rt<<1],tree[rt<<1|1]);}void Pushup_min(int rt){ tree[rt]=Min(tree[rt<<1],tree[rt<<1|1]);}void build(int l,int r,int rt) /*建树*/{ if(l==r) // 当区间长度为 0 时,结束递归 { scanf("%d",&tree[rt]); return; } int m=(l+r)>>1; build(lchild); build(rchild); Pushup(rt);}void update(int p,int add,int l,int r,int rt) // 单点更新{ if(l==r) { tree[rt]=add; return ; } int m=(l+r)>>1; if(p<=m) update(p,add,lchild); else update(p,add,rchild); Pushup(rt);}int query(int L,int R,int l,int r,int rt) //区间查询{ if(L<=l&&r<=R) { return tree[rt]; } int m=(l+r)>>1; int sum=0; if(L<=m) sum=max(sum,query(L,R,lchild)); if(R>m) sum=max(sum,query(L,R,rchild)); return sum;}int scan(){ int res = 0, flag = 0; char ch; if((ch = getchar()) == '-') flag = 1; else if(ch >= '0' && ch <= '9') res = ch - '0'; while((ch = getchar()) >= '0' && ch <= '9') res = res * 10 + (ch - '0'); return flag ? -res : res;}int main(){ int t,n,m,i,j,tot=1; while(~scanf("%d%d",&n,&m)) { build(1,n,1); while(m--) { char op[10]; int a,b; scanf("%s%d%d",op,&a,&b); if(op[0]=='Q') printf("%d\n",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0;}
0 0
- 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(线段树之 单点更新+区间最值)
- 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 (线段树--单点更新,区间最值)
- 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(线段树:单点替换,区间最值)
- HDU 1754 I Hate It 【线段树 (单点替换 区间最值】
- HDU 1754 I Hate It (线段树 单点替换, 区间最值)
- HDU 1754 I Hate It(线段树单点替换/区间最值)
- 【转载】数据库设计原则
- HDU 5192 [迷之WA!]
- java 验证邮箱格式正确性、验证字符串是否为数字
- 安装unbuntu
- hdu 1717 小数化分数2(数学)
- HDU 1754 I hate it 【线段树--单点更新,区间最值】
- Starting MySQL...The server quit without updating PID file (/usr/local/mysql/data/rekfan.pid)
- C/C++中const关键字详解(四)
- iOS开发内存警告Memory Warning和ViewController的生命周期的问题
- HttpURLConnection用法详解
- SQL update 用另外一个表更新一列
- 系统调用过程的理解
- IO包中的其他类2和字符编码
- HTTP 缓存