线段树
来源:互联网 发布:2017年的网络暴力事件 编辑:程序博客网 时间:2024/06/05 05:05
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
在每个测试的第一行,有两个正整数 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。
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
5659
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>#define mid (l + r)/2#define maxn 200005#define inf 0x3f3f3f3fusing namespace std;int sum[maxn<<2], maxs[maxn << 2];void PushUp(int id) //更新节点{ sum[id] = sum[id << 1] + sum[id << 1 | 1]; maxs[id] = max(maxs[id << 1], maxs[id << 1 | 1]);}void Build(int l, int r, int id) //建造线段树{ if(l == r) { scanf("%d", &sum[id]); maxs[id] = sum[id]; return ; } Build(l, mid, id << 1); Build(mid + 1, r, id << 1 | 1); PushUp(id);}int QueryMax(int l, int r, int id, int ql, int qr) //求区间最大值{ if(r < ql || l > qr) return 0; if(l >= ql && r <= qr) return maxs[id]; int ret = -inf; ret = max(ret, QueryMax(l, mid, id << 1, ql, qr)); ret = max(ret, QueryMax(mid + 1, r, id << 1 | 1, ql, qr)); return ret;}void Update(int l, int r, int id, int pos, int chg) //更改区间{ if(l > pos || r < pos) return; if(l == r && l == pos) { sum[id] = chg; //sum[id] += chg; maxs[id] = chg; //maxs[id] += chg; 更改为chg或加上chg return ; } Update(l, mid, id << 1, pos, chg); Update(mid + 1, r, id << 1 | 1, pos, chg); PushUp(id);}int Query(int l, int r, int id, int ql, int qr) //求区间和{ if(r < ql || l > qr) return 0; if(l >= ql && r <= qr) return sum[id]; long long ans = 0; ans += Query(l, mid, id << 1, ql, qr); ans += Query(mid + 1, r, id << 1 | 1, ql, qr); return ans;}int main(){ int n, m, l, r; char s; while(~scanf("%d %d", &n, &m)) { Build(1, n, 1); getchar(); while(m--) { scanf("%c %d %d", &s, &l, &r); getchar(); if(s == 'Q') cout << QueryMax(1, n, 1, l, r) << endl; else Update(1, n, 1, l, r); } } return 0;}
阅读全文
1 0
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- Python:numpy中random使用
- 微信小程序图片实现宽度100%,高度自适应
- c++ stl map<> 容器测试
- 术--一张图玩懂线程状态
- 两列自适应和三列自适应布局
- 线段树
- gcc编译动态和静态链接库
- MATLAB程序生成了txt文本文档,记事本打开不换行
- 网易2018校招编程题集合8
- 定时器alarm函数
- VB6.0软件调用VS C++ DLL问题解决
- 开始写blog
- Tr A
- 数组中出现的次数超过数组长度的一半的数字