线段树---HDU1754 I hate it

这个题也是线段树的基础题,有了上一个题的基础,在做这个题就显得比较轻松了,大体都是一样的,那个是求和,这个改成求最大值,基本上思路差不多,下面是代码的实现

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 const int MAX = 200010 * 4;
 8 int segment[MAX];
 9 //向上调整
10 void pushUp(int root)
11 {
12     segment[root] = max(segment[root * 2], segment[root * 2 + 1]);
13 }
14
15 void buildTree(int root, int left, int right)
16 {
17     if(left == right)
18     {
19         scanf("%d", &segment[root]);
20         return;
21     }
22     int mid = (left + right) / 2;
23     buildTree(root * 2, left, mid);
24     buildTree(root * 2 + 1, mid + 1, right);
25     //要把跟他上面所有关联的节点都要更新
26     pushUp(root);
27 }
28 //更新节点
29 void update(int root, int pos, int update_num, int left, int right)
30 {
31     if(left == right)
32     {
33         segment[root] = update_num;
34         return;
35     }
36     int mid = (left + right) / 2;
37     if(pos <= mid)
38     {
39         update(root * 2, pos, update_num, left, mid);
40     }
41     else
42     {
43         update(root * 2 + 1, pos, update_num, mid + 1, right);
44     }
45     pushUp(root);
46 }
47 //left和right为要查找的区间,L和R为当前查到了哪个区间
48 int getMax(int root, int left, int right, int L, int R)
49 {
50     if(L == left && R == right)
51     {
52         return segment[root];
53     }
54     int mid = (left + right) / 2;
55     int Max_Num = 0;
56     if(R <= mid)
57     {
58         Max_Num = getMax(root * 2, left, mid, L, R);
59     }
60     else if(L > mid)
61     {
62         Max_Num = getMax(root * 2 + 1, mid + 1, right, L, R);
63     }
64     else
65     {
66         Max_Num = getMax(root * 2, left, mid, L, mid);
67         Max_Num = max(Max_Num, getMax(root * 2 + 1, mid + 1, right, mid + 1, R));
68     }
69     return Max_Num;
70 }
71
72 int main()
73 {
74     int N, M;
75     while(~scanf("%d %d", &N, &M))
76     {
77         memset(segment, 0, sizeof(segment));
78         buildTree(1, 1, N);
79         char ch;
80         int t1, t2;
81         for(int i = 0; i < M; i++)
82         {
83             getchar();
84             scanf("%c %d %d", &ch, &t1, &t2);
85             if(ch == ‘U‘)
86             {
87                 update(1, t1, t2, 1, N);
88             }
89             else
90             {
91                 printf("%d\n", getMax(1, 1, N, t1, t2));
92             }
93         }
94     }
95     return 0;
96 }
时间: 2024-11-02 11:57:36

线段树---HDU1754 I hate it的相关文章

入手线段树 hdu1754

今天学习了线段树的三个基本操作 建树 更新 查找 先理解下什么是线段树就这个题目而言 如果我们用普通的数组去存放 然后依次遍历访问的话 时间太多了线段树利用了二分的思想 把数据以段的形式进行储存 这样在访问的时候 时间复杂度就下来了 上图就是线段树的一个简单的模型 创建线段树(初始化)]: 由于线段树是用二叉树结构储存的,而且是近乎完全二叉树的,所以在这里我使用了数组来代替链表上图中区间上面的红色数字表示了结构体数组中对应的下标. 在完全二叉树中假如一个结点的序号(数组下标)为 I ,那么 (二

hdu1754 I Hate It (简单线段树应用)

题目连接:hdu1754 I Hate It 本题考查的是线段树的基本操作.如果不懂线段树的基本操作请移步:这里 这一题是我学完线段树后的第一道线段树的题,可以说是十分的基础,我刚学完就可以一遍AC.大家只要对线段树的基本操作有所了解,应该是可以轻松AC的. 代码如下: // 有效结点: 200000 // 深度达到:(lg200000)/(lg2) +1 约等于 19 // 其完全二叉树 总结点 个数为: (1<<19) - 1 个 #include <stdio.h> #def

【HDU1754】I Hate It(线段树)

update:单点替换 query:区间最值 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <numeric> 6 #include <cctype> 7 #include <algorithm> 8 #include <cmath> 9 #include <ve

hdu1754 I Hate It(线段树)

题目意思: http://acm.hdu.edu.cn/showproblem.php?pid=1754 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分

hdu1754 线段树

1 //Accepted 7172 KB 515 ms 2 //基础线段树 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 200005; 8 struct node 9 { 10 int l,r; 11 int tmax; 12 }f[imax_n*3]; 13 int a[imax_n]; 14 int

HDU1754(线段树)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 51036    Accepted Submission(s): 20011 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

HDU-1754 I Hate It(线段树、点变化+段查询---模板)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 81735    Accepted Submission(s): 31442 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

HDU1754 I HATE IT【线段树】

题面: Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 大致思路: 依然是一个裸的线段树,点修改+区间询问,不过要求和上一题不一样.这个题求的是区间最大值. 把树中存的数改

hdu1754 I hate it (线段树)

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 55291 Accepted Submission(s): 21599 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一