I Hate It

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

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

感想:先前没学什么算法,看这个线段数组真有点吃力,没办法,硬着头皮模仿大神代码,结果WA了几次,再超时几次,不知道为什么超时,晚上搜了不少‘标程’……原来是因为宏定义

#define max(a,b) ((a)>(b)?(a):(b))//

//调用参数含有dfs,结果变成dfs(c) > ans?dfs(c):ans这样
//那么dfs可能会执行两次了
//实际上你需要的知识dfs(c)的值比较就行了,执行一次就可以了

最后直接用#include <algorithm>里面的max.

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. //#define max(a,b) ((a)>(b)?(a):(b))
  5. #define lson l , m , rt << 1
  6. #define rson m + 1 , r , rt << 1 | 1
  7. #define maxn 222222
  8.  
  9. int stu[maxn<<2];
  10.  
  11. void PushUP(int rt)
  12. {
  13. stu[rt]=max(stu[rt<<1],stu[rt<<1|1]);
  14. }
  15.  
  16. void build(int l,int r,int rt)
  17. {
  18. if(l==r){
  19. scanf("%d",&stu[rt]);
  20. return ;
  21. }
  22. int m =(l+r)>>1;
  23. build(lson);
  24. build(rson);
  25. PushUP(rt);
  26. }
  27.  
  28. void update(int p,int num,int l,int r,int rt)
  29. {
  30. if(l==r)
  31. {
  32. stu[rt] =num;
  33. return ;
  34. }
  35. int m=(l+r)>>1;
  36. if(p<=m)
  37. update( p, num, lson );
  38. else
  39. update ( p, num, rson );
  40. PushUP(rt);
  41. }
  42.  
  43. int query(int L,int R,int l,int r,int rt)
  44. {
  45. if( L<=l&&r<=R )
  46. return stu[rt];
  47.  
  48. int m =(l + r) >> 1;
  49. int ret=0;
  50. if(L<=m) ret=max(ret,query(L,R,lson));
  51. if(R>m) ret=max(ret,query(L,R,rson));
  52. return ret;
  53. }
  54.  
  55. int main()
  56. {
  57. int N,M;
  58. while(scanf("%d%d",&N,&M)!=EOF)
  59. {
  60. build(1,N,1);
  61. for(int i=1 ; i<=M ; i++ )
  62. {
  63. char c[2];
  64. int a,b;
  65. scanf("%s%d%d",c,&a,&b);
  66.  
  67. if(c[0]=='Q')
  68. printf("%d\n",query(a, b, 1, N, 1) );
  69. else
  70. update(a, b, 1, N, 1);
  71. }
  72. }
  73. return 0;
  74. }

I Hate It(线段数组基础题)的更多相关文章

  1. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  2. hdu 1166 敌兵布阵(线段树基础题)

    学习线段树~~~~~~~~~~~~要好好理解 此题是单点更新的线段树,考虑基本的询问,更新. #include <iostream> #include <algorithm> ...

  3. poj 2774 Long Long Message 后缀数组基础题

    Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 24756   Accepted: 10130 Case Time Limi ...

  4. hdu 3518 Boring counting 后缀数组基础题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  5. POJ 2777 线段树基础题

    题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...

  6. Poj 3246 Balanced Lineup(线段树基础)

    依旧是线段树基础题 询问区间的最大值和最小值之差,只有询问,没有插入删除.继续理解基础线段树 #include <iostream> #include <algorithm> ...

  7. JavaScript数组基础编程题归纳

    之前的随笔"JavaScript中数组类型的属性和方法"中有介绍很多数组类型的方法,但都是一些理论.最近在练习在线编程题,发现自己还是习惯于用常规的循环来答题,对于数组的方法的使用 ...

  8. HDU 1166 敌兵布阵(线段树/树状数组模板题)

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

  9. Android测试基础题(三)

    今天接着给大家带来的是Android测试基础题(三).    需求:定义一个排序的方法,根据用户传入的double类型数组进行排序,并返回排序后的数组 俗话说的好:温故而知新,可以为师矣 packag ...

随机推荐

  1. [新手学Java]使用beanUtils控制javabean

    使用BeanUtils设置/读取属性的值以及默认支持的自动转化: @Test //使用BeanUtils设置/读取属性的值以及自动转化 public void test1() throws Illeg ...

  2. C#中this的 四种 用法

    C#中的this用法,相信大家应该有用过,但你用过几种?以下是个人总结的this几种用法,欢迎大家拍砖,废话少说,直接列出用法及相关代码. this用法1:限定被相似的名称隐藏的成员 /// < ...

  3. 获取 Windows Phone 手机系统信息

    wpf: <phone:PhoneApplicationPage x:Class="ABSystemInfo.MainPage" xmlns="http://sch ...

  4. Interlocked.CompareExchange

    class SourceManager { private SourceManager() { } private static SourceManager sourceManager; public ...

  5. 常用SQL查询语句

    一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ...

  6. Visual Studio 2013 Preview 新功能

    先来看一下Visual Studio的版本历史: 1. Visual Studio.NET 2002 2. Visual Studio.NET 2003 3. Visual Studio.NET 20 ...

  7. HTML Window.document对象

    1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:    var a =docunmen ...

  8. CSS动态伪类选择器温故-3

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

  9. 解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”

    在文档库中添加itemadded 后,在上传文件后,会自动打开文档属性的编辑页面,在保存的时候就会报错,说这个文档已经被编辑过了.这是应为默认itemadded实践是异步执行的,会在edit页面打开之 ...

  10. SharePoint Server 2010 & WorkFlow related Limits

    Today, I have come across different workflow related limits for SharePoint Server 2010. Limit Maximu ...