I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9465 Accepted Submission(s): 3534
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
此题的大意:给你一串数,问其中一个区间中的最大值是多少? 明显的线段树,最基本最基础的线段树,直接套用线段树的建树、更新、询问三个函数。
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
struct node
{
int left, right, mid;
int maxn;
}w[4*200005];
int val[200005];
int creat(int a, int b, int r) //建树
{
if(a == b)
{
w[r].left = w[r].right = a;
w[r].maxn = val[a];
return w[r].maxn;
}
w[r].left = a;
w[r].right = b;
w[r].mid = (a+b)/2;
w[r].maxn = max(creat(a, w[r].mid, 2*r), creat(w[r].mid+1, b, 2*r+1));
return w[r].maxn;
}
void update(int n, int m, int r) //更新
{
if(w[r].left == n && w[r].right == n)
{
w[r].maxn = m;
return;
}
if(n > w[r].mid)
{
update(n, m, 2*r+1);
w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn);
}
else
{
update(n, m, 2*r);
w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn);
}
}
int query(int a, int b, int r) //询问
{
if(w[r].left == a && w[r].right == b)
{
return w[r].maxn;
}
else if(a > w[r].mid)
{
return query(a, b, 2*r+1);
}
else if(b <= w[r].mid)
{
return query(a, b, 2*r);
}
else
{
return max(query(a, w[r].mid, 2*r), query(w[r].mid+1, b, 2*r+1));
}
}
int main()
{
char sh;
int i, t, n, x, y;
while(scanf("%d %d", &n, &t) != EOF)
{
for(i = 1; i <= n; i++)
{
scanf("%d", &val[i]);
}
creat(1, n, 1);
while(t--)
{
cin>>sh;
scanf("%d %d", &x, &y);
if(sh == 'Q')
{
printf("%d\n", query(x, y, 1));
}
else if(sh == 'U')
{
update(x, y, 1);
}
}
}
return 0;
}
分享到:
相关推荐
这篇博客“线段树入门学习(兼解HDU1754)”旨在帮助初学者理解线段树的基本概念,并通过解决HDU1754题目来实践其应用。 线段树的核心思想是将一个区间分解成多个子区间,然后对每个子区间进行预处理,存储区间的信息...
hdu 1166线段树代码
今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种树形结构,它将一个数组分割成多个小 区间,每个区间对应树上的一个节点。线段树的每个节点都包含了该...
标题与描述均提到了“hdu 1166线段树”,这表明文章的核心是关于线段树在解决特定问题中的应用。线段树是一种数据结构,主要用于处理区间查询和更新操作,尤其是在大规模数据集上。在本例中,通过分析给定的部分代码...
**案例1:Hdu1754 Ihateit** - **功能**: 单点替换与区间最值查询。 - **关键代码解析**: - **PushUp(int rt)**: 更新父节点的最大值。 - **build(int l, int r, int rt)**: 构建线段树,其中 `l` 和 `r` 表示...
- 最基础的线段树应用类型,主要涉及叶子节点的更新操作,随后通过 `PushUP` 函数将信息逐级向上更新至根节点。 - 示例题目包括 `hdu1166敌兵布阵` 和 `hdu1754IHateIt`。 - **`hdu1166敌兵布阵`**: - **题意*...
基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被覆盖的区间数量。这类问题的关键在于如何高效地更新和查询区间。 - **POJ 2528**:这是一道...
对于每个区间,从`bi+1`开始插入,直到`b(i+1)`,每次插入都会更新线段树中对应区间的`value`。 5. 插入完成后,可以通过查询线段树得到每个区间 `[ai, bi]` 内不同数字的和。 **时间复杂度分析**: - 每个数字...
HDU 1022 Train Problem I 附详细思路
题面 【题目描述】 ...(3)Query(3)Query(3)Query iii jjj ,iii和jjj为正整数,i≤ji\leq ji≤j,表示询问第iii到第jjj个营地的总人数; (4)End(4)End(4)End 表示结束,这条命令在每组数据最后出现;
线段树入门资料,有利于初学者学习,让他们详细了解线段树。
8. **图论与树**:HDU题目中可能涉及图的遍历(深度优先搜索DFS、广度优先搜索BFS)、树的遍历(前序、中序、后序)以及最小生成树、最短路径等算法。 9. **动态规划**:这是一种优化策略,通过构建状态转移方程来...
2. **线段树**:线段树是一种数据结构,用于高效地处理区间查询和更新操作。它可以实时维护一个区间内的信息,如求和、最大值或最小值。线段树在处理动态区间问题时非常有效,如在数组上进行区间加法、区间求和等...
3. **数据结构**:数组、链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图(邻接矩阵、邻接表、最小生成树、拓扑排序等)。 4. **字符串处理**:KMP算法、Manacher's Algorithm、Rabin-Karp算法等。 5. **...
【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源
"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码集合,旨在帮助学习者理解和掌握各种算法,提升编程解决问题的能力。 首先,我们来了解一下ACM/ICPC比赛。这是一项全球性的编程竞赛,参赛...
- 状态转移方程:$f[j] = \max\{f[j], f[j - q[i].money] + q[i].v\}$,其中$q[i].money$是第$i$个地点的价值,$q[i].v$是第$i$个地点的花费。 - 初始条件:$f[0] = 1$(不抢劫任何地方的情况)。 #### 3A:100A:...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
总结来说,"二叉搜索树练习 HDU3791"是一道关于二叉搜索树操作的编程题,可能需要实现插入、删除、查找等基本操作,并通过分析`Main.java`源码来理解和解决问题。同时,可能需要借助各种工具进行调试和测试,以确保...
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...