hdu1754
来源:互联网 发布:建筑学知乎 编辑:程序博客网 时间:2024/06/06 17:42
链接:点击打开链接
题意:本题目包含多组测试,请处理到文件结束,
在每个测试的第一行,有两个正整数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.
对于每一次询问操作,在一行里面输出最高成绩
代码:
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;const int SIZE=200005;int segtree[SIZE<<2];void build(int l,int r,int rt){ int m; if(l==r){ scanf("%d",&segtree[rt]); return ; } m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); segtree[rt]=max(segtree[rt<<1],segtree[rt<<1|1]);}void update(int p,int add,int l,int r,int rt){ int m; if(l==r){ segtree[rt]=add; return; } m=(l+r)>>1; if(p<=m) update(p,add,l,m,rt<<1); else update(p,add,m+1,r,rt<<1|1); segtree[rt]=max(segtree[rt<<1],segtree[rt<<1|1]);}int query(int L,int R,int l,int r,int rt){ int m,ans; if(L<=l&&r<=R) return segtree[rt]; m=(l+r)>>1; ans=0; if(L<=m) ans=max(ans,query(L,R,l,m,rt<<1)); if(R>m) ans=max(ans,query(L,R,m+1,r,rt<<1|1)); return ans;}int main(){ int n,m,i,j,a,b; char c; while(scanf("%d%d",&n,&m)!=EOF){ build(1,n,1); getchar(); for(i=0;i<m;i++){ scanf(" %c%d%d",&c,&a,&b); if(c=='Q') printf("%d\n",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0;}
0 0
- hdu1754
- hdu1754
- hdu1754
- hdu1754
- HDU1754
- hdu1754
- HDU1754
- HDU1754
- hdu1754
- hdu1754
- HDU1754
- hdu1754
- hdu1754
- hdu1754
- hdu1754
- hdu1754
- hdu1754
- HDU1754
- 营业部评价
- 一致性hash算法 C++语言实现
- gcc 优化细节
- js 简易时钟
- uva408 Uniform Generator
- hdu1754
- style和currentStyle使用
- hive启动报错:Terminal initialization failed; falling back to unsupported
- 链表实现队列 c语言
- Leetcode 205 Isomorphic Strings 同构字符串
- 键盘键与虚拟键码对照表
- "Auto Layout still required after executing -layoutSubviews” iOS7上崩溃sdk缺陷
- bzoj 2743
- C++(1)入门