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. JDK1.6官方下载_JDK6官方下载

    JDK1.6官方下载_JDK6官方下载地址: http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin ...

  2. 快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors

    What is FLANN? FLANN is a library for performing fast approximate nearest neighbor searches in high ...

  3. 【BZOJ】【2200】【USACO 2011 Jan】道路和航线

    做了一天…… TLE:数组开小了-_-#道路是有50000的,双向要乘二.(我特么怎么想的就以为是树了……) WA:一些大点都WA了,小点都过了.好纠结…… AC了QAQ,不知道为什么,在并查集合并的 ...

  4. 如何使用Windows Library文件进行持久化

    前言 想象一下,假设在你不知道的情况下,攻击者在你的计算机上放置了一个恶意文件.每当你访问桌面上某个文件夹时(例如Documents文件夹),都会执行一次该文件.这样的场景,通过利用一种鲜为人知的持久 ...

  5. [转]室友靠打游戏拿30万offer,秘密竟然是……

    又是一年秋招季,苦逼的小编还天天泡在图书馆里刷PAT,室友大佬却已经到处拿offer.上周某室友已经成功拿到杭州某企业年薪30W的offer,小编虚心向其讨教,某室友一脸兴奋地告诉小编,HR让面试者们 ...

  6. Android Studio体验(二)--创建项目和Genymotion试用

    上周日已经体验了一把Android Studio顺便没事点了点其他功能,不过还是从自己创建项目开始说吧,首先我们要熟悉Android Studio中的Project 和 Module 两个概念.And ...

  7. C# 事件(Event)

    事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. 通过事件使用委托 事件在 ...

  8. IOS开发之地图导航

    一.问题描述 现在很多的APP 都开始引入了地图和定位功能,包括一些餐饮业,团购等.他们都过定位和地图来让用户更加方便的根据自己的位置找到合适的目标,也就是说,现在地图定位已经不再是导航工具类,地图工 ...

  9. 【北京】低价出售C/C++经典书籍

    都非常新   C++程序设计 5元 高质量C/C++编程指南 8元   C++对象模型 10元 STL源代码剖析 12元 深入浅出MFC 10元 设计模式 10元 C++ primer 8元 面向对象 ...

  10. spark streaming的理解和应用

    1.Spark Streaming简介 官方网站解释:http://spark.apache.org/docs/latest/streaming-programming-guide.html 该博客转 ...