蓝桥杯 ALGO-8 算法训练 操作格子(线段树)
有n个格子,从左到右放成一排,编号为1-n。
共有m次操作,有3种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个2、3操作输出你所求出的结果。
输入格式
第一行2个整数n,m。
接下来一行n个整数表示n个格子的初始权值。
接下来m行,每行3个整数p,x,y,p表示操作类型,p=1时表示修改格子x的权值为y,p=2时表示求区间[x,y]内格子权值和,p=3时表示求区间[x,y]内格子最大的权值。
输出格式
有若干行,行数等于p=2或3的操作总数。
每行1个整数,对应了每个p=2或3操作的结果。
样例输入
4 3
1 2 3 4
2 1 3
1 4 3
3 1 4
样例输出
6
3
数据规模与约定
对于20%的数据n <= 100,m <= 200。
对于50%的数据n <= 5000,m <= 5000。
对于100%的数据1 <= n <= 100000,m <= 100000,0 <= 格子权值 <= 10000。
分析:用结构体数组建立一棵线段树~当p==1时从上到下更新这个线段树的值,当p==2的时候搜索对应区间内的总和~当p==3的时候搜索对应区间的最大值~
#include <iostream>
#define max(a, b) a > b ? a : b;
using namespace std;struct node {int l;int r;int maxvalue;int sum;
} a[1000000];void init(int left, int right, int i) {a[i].l = left;a[i].r = right;a[i].maxvalue = 0;a[i].sum = 0;if(left != right) {int mid = (left + right) / 2;init(left, mid, 2 * i);init(mid + 1, right, 2*i+1);}
}void insert(int i, int j, int value) {if(a[i].l == a[i].r) {a[i].maxvalue = value;a[i].sum = value;return ;}int mid = (a[i].l + a[i].r) / 2;if(j <= mid)insert(2 * i, j, value);elseinsert(2 * i + 1, j, value);a[i].maxvalue = max(a[2*i].maxvalue, a[2*i+1].maxvalue);a[i].sum = a[2*i].sum + a[2*i+1].sum;
}int find_sum(int i, int x, int y) {if(x == a[i].l && y == a[i].r) {return a[i].sum;}int mid = (a[i].l + a[i].r) / 2;if(y <= mid)return find_sum(2*i, x, y);else if(x > mid)return find_sum(2*i+1, x, y);elsereturn find_sum(2*i, x, mid)+ find_sum(2*i+1, mid+1, y);
}int find_max(int i, int x, int y) {if(x == a[i].l && y == a[i].r) {return a[i].maxvalue;}int mid = (a[i].l + a[i].r) / 2;if(y <= mid)return find_max(2*i, x, y);else if(x > mid)return find_max(2*i+1, x, y);elsereturn max(find_max(2*i, x, mid), find_max(2*i+1, mid+1, y));
}int main() {int n, m;cin >> n >> m;init(1, n, 1);int value;for(int j = 1; j <= n; j++) {cin >> value;insert(1, j, value);}for(int k = 0; k < m; k++) {int p, x, y;cin >> p >> x >> y;if(p == 1)insert(1, x, y);if(p == 2)cout << find_sum(1, x, y) << endl;if(p == 3)cout << find_max(1, x, y) << endl;}return 0;
}
蓝桥杯 ALGO-8 算法训练 操作格子(线段树)相关推荐
- 蓝桥杯:试题 算法训练 Remember the A La Mode
蓝桥杯:试题 算法训练 Remember the A La Mode 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Hugh Samston经营着一个为今年的ICPC世界总决赛的参 ...
- java实现 蓝桥杯 算法训练 操作格子
问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求 ...
- 矩阵乘法 算法训练 试题_蓝桥杯习题集_ 算法训练 矩阵乘法
原文: 算法训练 矩阵乘法 时间限制:1.0s 内存限制:512.0MB 问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s, ...
- 试题 算法训练 操作格子(线段树模板题)
资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3 ...
- 蓝桥杯练习系统算法训练习题加答案java版本
附上百度文库的链接:http://wenku.baidu.com/view/afb78d36b42acfc789eb172ded630b1c59ee9bf7 转载于:https://www.cnblo ...
- java蓝桥杯的题_Java蓝桥杯试题集——算法训练ALGO-116——最大的算式
题目要求 解题思路 动态规划,今天才弄明白QAQ,借鉴了这位大佬的博客,曹磊的博客 写的很好!但是我觉得我的循环方式更容易理解嘿嘿嘿~ 首先建立如下图的数组,行数代表前几位数,列数代表有几个乘号.将第 ...
- 蓝桥杯练习系统—算法训练 s01串
第一部分:题目 问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) 输出格式 n次变换后s01串 样例输入 3 样例输出 101 数据 ...
- 蓝桥杯:试题 算法训练 采油区域 矩阵前缀和+动态规划+分治+枚举
资源限制 时间限制:2.0s 内存限制:512.0MB 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M× ...
- 蓝桥杯-黑色星期五(算法训练)
题目描述: 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是"诸事不宜".请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是1 ...
最新文章
- oracle 创建空文件系统,六分钟学会创建Oracle表空间的实现步骤
- 【Ping】unix - ping命令的退出状态
- (android实战)Service 生命周期和使用注意项
- android uid systemui,(android)system ui 内存优化
- Python学习总结之四 -- 这就是Python的字典
- WriteFile API简介
- POJ 3669 简单BFS
- 免费下载 客道巴巴文档 教程
- Java word转pdf字体格式和样式变乱的问题
- 预见2022 | 吴晓波年终秀 附PPT
- 二维数组与指针(详解)
- 计算机电脑如何快捷粘贴,电脑粘贴快捷键在哪里【详细介绍】
- grub.exe和grldr的区别和联系
- wrf模式计算机配置,科学网-WRF模式的运行-张乐乐的博文
- SharePoint服务器端对象模型 之 使用CAML进行数据查询
- 无限流量与5G要来,我们距淘汰Wi-Fi还有多远?
- 利用福禄克光纤测试仪了解综合布线
- 灰色关联分析——Excel实现
- kali连接不上网络
- 【matlab教程】20、简单网格细分