I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33469    Accepted Submission(s): 13168

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

 
代码: 线段树之单点更新
代码:
 #include<stdio.h>
#define maxn 200001
int aa[maxn<<];
struct node
{
int lef,rig,maxc;
int mid(){ return lef+((rig-lef)>>); }
};
node seg[maxn<<];
void build(int left ,int right ,int p)
{
seg[p].lef=left;
seg[p].rig=right;
seg[p].maxc=;
while(left==right)
{
seg[p].maxc=aa[left];
return ;
}
int mid=seg[p].mid();
build(left,mid,p<<);
build(mid+ ,right,p<<|);
if(seg[p<<].maxc<seg[p<<|].maxc)
seg[p].maxc=seg[p<<|].maxc;
else
seg[p].maxc=seg[p<<].maxc;
}
void updata(int pos ,int p,int val)
{
if(seg[p].lef==seg[p].rig)
{
seg[p].maxc=val ;
return ;
}
int mid=seg[p].mid();
if(pos<=mid) updata(pos,p<<,val);
else if(pos>mid) updata(pos,p<<|,val);
if(seg[p<<].maxc<seg[p<<|].maxc)
seg[p].maxc=seg[p<<|].maxc;
else seg[p].maxc=seg[p<<].maxc;
}
int query(int be,int en ,int p)
{
if(be<=seg[p].lef&&seg[p].rig<=en)
return seg[p].maxc;
int res2=,res1=;
int mid=seg[p].mid();
if(be<=mid) res1=query(be,en ,p<<);
if(en>mid) res2=query(be,en ,p<<|);
if(res1<res2) return res2;
else return res1;
}
int main()
{
int nn,mm,i,j,sa,sb;
char str[];
while(scanf("%d%d",&nn,&mm)!=EOF)
{
for(i=;i<=nn;i++)
scanf("%d",&aa[i]);
build(,nn,);
while(mm--)
{
scanf("%s%d%d",str,&sa,&sb);
if(*str=='Q')
printf("%d\n",query(sa,sb,));
else updata(sa,,sb);
}
}
return ;
}

代码:

 #include<cstdio>
#include<cstring>
const int maxn=;
int aa[maxn];
struct node
{
int lef,rig;
int max;
int mid(){
return lef+((rig-lef)>>);
}
};
node str[maxn<<];
inline int max(int a,int b)
{
return a>b?a:b;
}
void Build(int left ,int right,int pos)
{
str[pos].lef=left;
str[pos].rig=right;
str[pos].max=;
if(left==right){
str[pos].max=aa[left];
return ;
}
int mid=str[pos].mid();
Build(left,mid,pos<<);
Build(mid+,right,pos<<|);
str[pos].max = max( str[pos<<].max , str[pos<<|].max );
}
void Update(int ps,int pos,int val)
{
if(str[pos].lef==ps&&str[pos].rig==ps){
str[pos].max=val; //将这个数值更新
return ;
}
int mid=str[pos].mid();
if(mid>=ps) Update(ps,pos<<,val);
else if(mid<ps) Update(ps,pos<<|,val);
str[pos].max=max(str[pos<<].max,str[pos<<|].max);
}
int Query(int st,int en,int pos)
{
if(str[pos].lef>=st&&str[pos].rig<=en){
return str[pos].max;
}
int mid=str[pos].mid();
int p1=,p2=;
if(mid>=st) p1=Query(st,en,pos<<);
if(mid<en) p2=Query(st,en,pos<<|);
return max(p1,p2);
} int main()
{
int n , m,cc,dd;
char ss[];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d",aa+i);
Build(,n,);
while(m--)
{
scanf("%s %d%d",ss,&cc,&dd);
if(*ss=='Q')
printf("%d\n",Query(cc,dd,));
else Update(cc,,dd);
}
}
return ;
}

HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)的更多相关文章

  1. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)

    I Hate ItTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. UVA12532 线段树(单点更新,区间求乘积的正负)

    It’s normal to feel worried and tense the day before a programming contest. To relax, you went out f ...

  4. HDU 3308 LCIS (线段树&#183;单点更新&#183;区间合并)

    题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  相应区间的LCIS长度(lcis)  相应区间以左 ...

  5. Codeforces768B-Code For 1-类似线段树-枚举+单点更新or区间更新

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  每次把\(n\ ...

  6. HDU1166线段树(单点更新,区间求和)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

  8. hdu1754线段树的单点更新区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. hdoj 2795 Billboard 【线段树 单点更新 + 维护区间最大值】

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. js获取本机mac地址,IP地址,计算机名

    <!DOCTYPE HTML> <html> <head> <title>js获取本机mac地址,IP地址,计算机名</title> < ...

  2. matlab 投影

    function[l]= Gray(I) % I: The name of image A=imread(I);m=0;n=0;[m,n]= size(A);Hproj=zeros(m,1);Vpro ...

  3. 快速入门:十分钟学会PythonTutorial - Learn Python in 10 minutes

    This tutorial is available as a short ebook. The e-book features extra content from follow-up posts ...

  4. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: SYSAUX  表空间  >  编辑 表空间: SYSAUX 1. 一般信息返 ...

  5. OTL翻译(9) --常量的SQL语句

    常量的SQL语句 一个没有绑定变量的SQL语句.SQL语句块或是存储过程就被称为常量的SQL语句.OTL通过一个静态的函数来执行这样的SQL语句. 例如: // static otl_cursor:: ...

  6. 【Todo】React & Nodejs学习 &事件驱动,非阻塞IO & JS知识栈:Node为主,JQuery为辅,Bootstrap & React为辅辅,其他如Angular了解用途即可

    JS知识栈:Node为主,JQuery为辅,Bootstrap & React为辅辅,其他如Angular了解用途即可 今天在学习ReactJS和NodeJS,看到关于ReactJS的这篇文章 ...

  7. Python并发编程-Redis

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Remote Dictionary Server(Redis)是一个基于 key-value ...

  8. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

  9. iOS开发-Xcode入门ObjC程序

    元旦三天假跟妹子冷战一天半,剩下的半天觉得无聊,可以写点东西,折腾了下xCode 6.1,虽然iPhone6比较丑,但是不影响IOS在高端机上面的地位,ObjC是扩充C的面向对象编程语言.主要使用于M ...

  10. 动态图片 Movie android-gif-drawable GifView

    Movie 类 文档位置:/sdk/docs/reference/android/graphics/Movie.html 官方对这个类连一句介绍都没有,并且所有的方法也没有一行注释,可见多么不受重视! ...