训练之线段树I Hate It
来源:互联网 发布:太阳能热水器 知乎 编辑:程序博客网 时间:2024/06/03 17:24
I Hate ItCrawling in process...Crawling failedTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Hint
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 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
Sample Output
5659
Hint
Huge input,the C function scanf() will work better than cin
询问次数很多需要用到线段树,单点更新,子叶更新后对应的根也应该更新。
每个节点中存的都是最大值,最下层的子叶存的最大值就是本身值。
#include<stdio.h>#define MAX 4000000int n,m,ans,cnt;int a[200010];struct stree{//线段树 int l,r,ma;}tree[MAX];int Max(int a,int b){ return a>b?a:b;}void btree(int l,int r,int t){//构建线段树 int x; tree[t].l=l; tree[t].r=r; tree[t].ma=0; if(l==r){ while(t){ if(tree[t].ma<a[l]) tree[t].ma=a[l]; t/=2; } return ; } x=(l+r)/2; btree(l,x,2*t); btree(x+1,r,2*t+1);}void utree(int l,int r,int t){//更新线段树 int x; if(tree[t].l==l&&tree[t].r==r){ tree[t].ma=cnt; while(t){ t/=2; tree[t].ma=Max(tree[2*t].ma,tree[2*t+1].ma); } return ; } x=(tree[t].l+tree[t].r)/2; if(x>=r) utree(l,r,2*t); else if(x<l) utree(l,r,2*t+1); else{ utree(l,x,2*t); utree(x+1,r,2*t+1); }}void qtree(int l,int r,int t){//访问线段树 if(tree[t].l==l&&tree[t].r==r){ if(ans<tree[t].ma) ans=tree[t].ma; return ; } int x; x=(tree[t].l+tree[t].r)/2; if(x>=r) qtree(l,r,2*t); else if(x<l) qtree(l,r,2*t+1); else{ qtree(l,x,2*t); qtree(x+1,r,2*t+1); }}int main(){ int i,j; while(~scanf("%d%d",&n,&m)&&n!=0){ for(i=1;i<=n;i++) scanf("%d",&a[i]); btree(1,n,1); for(j=0;j<m;j++){ char str[10]; int l,r; scanf("%s",str); scanf("%d%d",&l,&r); if(str[0]=='Q'){ ans=0; qtree(l,r,1); printf("%d\n",ans); } if(str[0]=='U'){ cnt=r; utree(l,l,1); } } } return 0;}
0 0
- 训练之线段树I Hate It
- 【hdu 1754】I Hate It 【线段树 训练1】
- I Hate It (线段树)
- 线段树:I Hate It
- i hate it 线段树
- I Hate It 【线段树】
- I Hate It---线段树
- I hate it --线段树
- I Hate It (线段树)
- 线段树i hate it
- I Hate It(线段树)
- 线段树之(二) hdu1754 I Hate It
- 线段树之HDU 1754 I hate it
- I hate it HDU【线段树】
- 线段树--【HDU I Hate It】
- HDU 1754 I Hate It 线段树
- [hdu] 1754 I hate it -- 线段树
- hdu 1754 -- I Hate It (线段树)
- PyGobject(十八)布局容器之ActionBar
- Android--数据库的增删改查之数据库的增加
- Android网络请求的架构之路
- 关于ListView的小知识
- 源码-PL/SQL从入门到精通-第十六章-动态SQL语句-Part 2
- 训练之线段树I Hate It
- jdbc.properties 文件的配置
- 关于editext笔记
- 玩转HTML5移动页面——动效篇
- HTTP 错误 404.3 - Not Found(在下载.apk文件时出现错误)
- 浏览器缓存机制
- Android 网络爬虫demo
- mysql 主从库配置
- Java中Math类中的方法