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. json-lib包笔记

    json-lib.jar开发包使用: 依赖包:commons-beanutils.jar;commons-httpclient.jar;commons-lang.jar;ezmorph.jar;不少人 ...

  2. C++中的public、private、protected成员继承问题

        我是C++菜鸟,刚学了一点C++. 先看例子1: /* Item.h */ #include <iostream> #include <string> class It ...

  3. 【BZOJ】【2752】【HAOI2012】高速公路(Road)

    数学期望/线段树 然而又是一道road= =上一道是2750…… 下次不要一看期望题就弃疗么…… 期望题≠不可做题……!! 其实在这题中,期望就是(所有情况下 权值之和)/(总方案数) 因为是等概率抽 ...

  4. Android 项目的代码混淆,Android proguard 使用说明

    简单介绍 Java代码是非常easy反编译的. 为了非常好的保护Java源码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还 ...

  5. Objective-C:分类(Category、extension)

    分类(Category .Extension) (一)分类的划分     (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量.           2.(未命名的类别)类 ...

  6. 屏保:画线圈LineFlower

    LineFlowerSP 小时候玩过一种画线圈的玩具,将一个圆形齿轮在一个大圈里转,会画出各种图形来.这个程序就是模仿它做的.算法原理:将一个圆围绕着另一个大圆公转,并且它还做自转运动.那么圆内一点的 ...

  7. CentOS7.0 x86_64系统上构建php开发环境--Lamp(包含设置虚拟文件夹,加入SELinux对httpd的支持等知识)

    一.安装mysql,直接用yum安装就可以,mysql在centos7.0版本号中被mariadb替代了. 命令: yum install mysql-server mysql 安装好了,选择改动my ...

  8. 25个iptables常用示例

    本文将给出25个iptables常用规则示例,这些例子为您提供了些基本的模板,您可以根据特定需求对其进行修改调整以达到期望. 格式 iptables [-t 表名] 选项 [链名] [条件] [-j ...

  9. kettle根据参数动态派生列

    抽取数据的时候没有日期字段,需要根据抽取日期自动生成月份,如下图结构 表输入_参数部分,接收来自其他系统传过来的参数(JAVA程序或者页面),具体设置如图 在查询数据时候派生列 运行模型的时候,给参数 ...

  10. Inception in CNN

    之前也写过GoogLeNet的笔记.但那个时候对Inception有些似懂非懂,这周又一次看了一遍,觉得有了新的体会,特地又一次写一篇博客与它再续前缘. 本文属于论文笔记性质.特此声明. Networ ...