[蓝桥杯]ALGO-8.算法训练_操作格子
题目描述:
问题描述
有n个格子,从左到右放成一排,编号为1-n。 共有m次操作,有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操作的结果。 样例输入 样例输出 数据规模与约定
对于20%的数据n <= ,m <= 。 对于50%的数据n <= ,m <= 。 对于100%的数据1 <= n <= ,m <= , <= 格子权值 <= 。
题目描述
代码如下:
#include <stdio.h>
#define MAX(X,Y) (X)>(Y)?(X):(Y) struct node
{
int l,r,max,sum;
}a[]; //初始化线段树
void init(int l,int r,int index)
{
int mid;
a[index].l = l;
a[index].r = r;
a[index].max = ;
a[index].sum = ;
if (l != r)
{
mid = (l+r)/;
init(l,mid,*index);
init(mid+,r,*index+);
}
return ;
} //更新对应点的权值
void update(int old,int date,int index)
{
int mid;
if (old>=a[index].l && old<=a[index].r)//更新点所在区间的信息
{
a[index].max = date;//更新点所在区间的最大值
a[index].sum = date;//更新点所在区间的和
}
if (a[index].l == a[index].r)
return ; mid = (a[index].l + a[index].r)/;
if (old <= mid)
update(old,date,*index);
else
update(old,date,*index+); a[index].sum = a[*index].sum + a[*index+].sum;
a[index].max = MAX(a[*index].max,a[*index+].max);
return ;
} //查找区间的最大值
int find_max(int l,int r,int index)
{
int mid;
if (l==a[index].l && r==a[index].r)
return a[index].max; mid = (a[index].l + a[index].r)/;
if (l > mid)
return find_max(l,r,*index+);
else if (r <= mid)
return find_max(l,r,*index);
else
return MAX(find_max(l,mid,*index),find_max(mid+,r,*index+));
} //求区间和
int find_sum(int l,int r,int index)
{
int mid;
if (l==a[index].l && r==a[index].r)
return a[index].sum; mid = (a[index].l + a[index].r)/; if (l > mid)
return find_sum(l,r,*index+);
else if(r <= mid)
return find_sum(l,r,*index);
else
return find_sum(l,mid,*index)+find_sum(mid+,r,*index+);
} int main(void)
{
int i;
int n,m,date,x,y;
scanf("%d%d",&n,&m);
init(,n,);
for (i= ; i<=n ; i ++)
{
scanf("%d",&date);
update(i,date,);//将i替换为date
} while (m--)
{
scanf("%d%d%d",&date,&x,&y);
switch(date)
{
case :
update(x,y,);break;//将x替换为y
case :
printf("%d\n",find_sum(x,y,));break;//区间[x,y]的权值和
case :
printf("%d\n",find_max(x,y,));break;//区间[x,y]的最大权值
default:break;
}
} return ;
}
C解法
参考:https://blog.csdn.net/libin56842/article/details/19909975
线段树了解:https://www.cnblogs.com/AC-King/p/7789013.html
解题思路:
题目要求包括,1.权值替换;2.求区间和;求区间最大值
普通数组查询方法对于2,3问题会出现超时,故使用线段树
线段树类似二分查找,可大大缩短查找时间
线段树适用问题:
1.求区间数字和=左区间数字和+右区间数字和
2.最大公因数(GCD)=gcd(左区间gcd,右区间gcd)
3.最大值=max(左区间max,右区间max)
[蓝桥杯]ALGO-8.算法训练_操作格子的更多相关文章
- 蓝桥杯-算法训练--ALGO-8 操作格子
问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求 ...
- 蓝桥杯练习系统— 算法训练 Beaver's Calculator
问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...
- 蓝桥杯练习系统算法训练习题加答案java版本
附上百度文库的链接:http://wenku.baidu.com/view/afb78d36b42acfc789eb172ded630b1c59ee9bf7
- ALGO-143_蓝桥杯_算法训练_字符串变换
问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,,,,5这5个参数分别指代不同的5种字符串操作, ...
- [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼
问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...
- [蓝桥杯]ALGO-92.算法训练_前缀表达式
问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法).“-”(减法).“*”(乘法)或“/”(除法),运算对象为 ...
- [蓝桥杯]ALGO-79.算法训练_删除数组零元素
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...
- ALGO-6_蓝桥杯_算法训练_安慰奶牛
记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include ...
- ALGO-5_蓝桥杯_算法训练_最短路
记: 一开始没接触过关于最短距离的算法,便开始翻阅关于图的知识, 得知关于最短距离的算法有Dijkstra算法(堆优化暂未看懂),Bellman-Ford算法,Floyd算法,SPFA算法. 由于数据 ...
随机推荐
- Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)
C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...
- matlab数组和矩阵
数组创建 要创建每行包含四个元素的数组,请使用逗号 (,) 或空格分隔各元素. a = [1 2 3 4] a = 1×4 1 2 3 4 这种数组为行向量. 要创建包含多行的矩阵,请使用分号分隔各行 ...
- 如何在git上创建的本地仓库
一.安装git(在git) 二. 三.输入个人信息(代码提交者) git config --global user.name "xxxx" git config --global ...
- 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)
你运行一下代码会发现,无论你点击哪个列表,控制台都是输出10.这是因为var声明的变量是函数作用域的,而不是块级作用域的.也就是说,for循环10次,每次都是改变同一个i,所以它的值会从0一直加到10 ...
- day 019 常用模块
主要内容: 1模块的简单认识 2collection模块 3time时间模块 4random模块 5os模块 6sys模块 一 模块的简单认识 引入模块的方式: 1import (常见方式) 2 ...
- win10 ubuntu 同一硬盘双系统安装和启动设置
1.了解启动的顺序 电脑开机---> BIOS 设置 ----> 硬盘(MBR)/ GPT格式里的ESP分区 ---> (UEFI/GRUB)目录里的 *****.efi -- ...
- Manjaro启动项目及服务配置备忘
Manjaro启动项目及服务配置备忘 =============== 系统服务GUI管理搜索 systemdgenie 并安装,类似Windows的服务管理. ================ 系统启 ...
- webapi core2.1 Identity.EntityFramework Core进行配置和操作数据 (一)没什么用
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.1&am ...
- c# 自定义log4net过滤器
有时候为了实现自己想要的多个日志文件记录不同的内容,可能需要自定义log4net过滤器,比如我这里需要记录三个文件,这三个文件的内容又不能重复,多次尝试未果. 为了不更改任何现有日志代码的情况下,于是 ...
- (惊艳)对象序列化和反序列--Hibernate的查询和新增极其相似
Hibernate几个关键字持久化,ORM(关系对象映射)(数据库中关系称作是一张表) 应用在项目中,刘一从写的查询代码,每次都挂掉,想要弄出测试数据,自己想着把查询出来的复杂数据弄到文件里自己要是去 ...