码迷,mamicode.com
首页 > 其他好文 > 详细

I Hate It(HDU1754)

时间:2014-08-04 01:55:56      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   strong   io   

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

题目大意。。。。。。如红色部分。。。。

解题思路。。。。线段树的应用。。调用线段树模板,每个根节点储存它们子节点的最大值。每次遍历,只需要找到它们对应的位置,返回它们根节点储存的值即可。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

 

bubuko.com,布布扣
  1 #include<stdio.h>
  2 
  3 #define max(x1, y1) ((x1) > (y1) ? (x1) : (y1))
  4 
  5 struct node
  6 
  7 {
  8 
  9     int left , right , max;
 10 
 11 } T[600010];
 12 
 13 int a[200005];
 14 
 15 void create (int u,int l,int r)      //第u个节点的最左端为l,最右端为r。
 16 
 17 {                        
 18 
 19     T[u].left  = l;
 20 
 21     T[u].right = r;
 22 
 23     int mid = (l+r)/2;
 24 
 25     if( l == r)
 26 
 27     {  T[u].max = a[r];  return ; }
 28 
 29     create(u+u ,l, mid );
 30 
 31     create(u+u + 1,mid + 1, r );
 32 
 33     T[u].max =max(T[u+u].max,T[u+u+1].max);  //根节点储存它们子节点的最大成绩
 34 
 35 }
 36 
 37 int search_max(int l ,int r,int i)      //查找区间[l,r]上的最大值,值函数里i应该写1
 38 
 39 {
 40 
 41     if(l <= T[i].left &&T[i].right<= r)
 42 
 43         return T[i].max;
 44 
 45     else
 46 
 47     {
 48 
 49         int ans1 = -9999999, ans2 =-9999999;
 50 
 51         if(l <= T[i+i].right)    ans1 = search_max(l,r,i+i);
 52 
 53         if(r >= T[i+i+1].left)   ans2 = search_max(l,r,i+i+1);
 54 
 55         return max(ans1,ans2); 
 56 
 57     }
 58 
 59 }
 60 
 61 void change_tree(int order , int num,int i) //改变输入的数据中序号为order的值为num,同时更新该树
 62 
 63 {
 64 
 65     if(T[i].left == T[i].right)
 66 
 67     {
 68 
 69         T[i].max = num;
 70 
 71         return ;
 72 
 73     }
 74 
 75     else
 76 
 77     {
 78 
 79         if( order <= T[i+i].right)     change_tree(order,num,i+i);
 80 
 81         else                      change_tree(order,num,i+i+1);
 82 
 83         T[i].max = max(T[i+i].max,T[i+i+1].max);
 84 
 85     }
 86 
 87 }
 88 
 89 int main ()
 90 
 91 {
 92 
 93     int n,m,A,B;
 94 
 95     char c;
 96 
 97     int i;
 98 
 99    while(scanf("%d%d",&n,&m)!=EOF)
100 
101     {
102 
103         for(i=1;i<=n;i++)
104 
105            scanf("%d",&a[i]);
106 
107         create(1,1,n);
108 
109         for(i=1;i<=m;i++)
110 
111         {
112 
113             getchar();
114 
115             scanf("%c%d%d",&c,&A,&B);
116 
117             if(c==Q)
118 
119                printf("%d\n",search_max(A,B,1));
120 
121             else
122 
123             {
124 
125                 a[A] = B;
126 
127                 change_tree(A,B,1);
128 
129             }
130 
131         }
132 
133     }
134 
135     return 0 ;
136 
137 }
代码

 

I Hate It(HDU1754),布布扣,bubuko.com

I Hate It(HDU1754)

标签:des   style   blog   http   color   os   strong   io   

原文地址:http://www.cnblogs.com/satan-shanks/p/3889151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!