[蓝桥杯]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算法. 由于数据 ...
随机推荐
- swing的弹出窗口
swing作为基础的图形化显示界面开发,还是新手小难上手的一个项目学习,当然做好了之后的数据流转是对编程架构的很大提高. 这里我介绍一下swing的弹出窗口,作为界面交互的时候不可或缺的检测工具,简直 ...
- 求强连通分量Tarjan算法
]; // 时间戳 ; // 时间 ]; // 节点u所能访问到的最小时间戳 ]; // 节点u是否在栈中. ]; ; // 我们维护的信息. ]; // 给节点染色, 同一个连通块的节点应该是同一个 ...
- python性能分析——insert()
我们在list中插入数据时,经常使用这两个函数: append():在列表的末尾增加一个数据 insert():在某个特定位置前加一个数据 Python内的list实现是通过数组实现的,而不是链表的形 ...
- acm 2043
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- ajax及其工作原理
1.关于ajax的名字 ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. 2. ...
- xencenter如何安装Centos7虚拟机系统
xencenter的ip地址192.168.245.134(win10系统) 首先我们在win10系统安装好xencenter(这个软件可以直接在xenserver启动后,通过访问xenserver的 ...
- cget cmake 包管理工具
cget 是一个方便的进行cmake 包下载以及安装的工具 包含的特性 非侵入,无需编写特殊钩子就可以使用cmake 开箱即用, 由于使用了标准的基于cmake的方式,直接可以使用基于cmkae 的软 ...
- Gravitational Teleport 开源的通过ssh && kubernetes api 管理linux 服务器集群的网关
Gravitational Teleport 是一个开源的通过ssh && kubernetes api 管理linux 服务器集群的网关 支持以下功能: 基于证书的身份认证 ssh ...
- 自动化部署--shell脚本--1
传统部署方式1.纯手工scp2.纯手工登录git pull .svn update3.纯手工xftp往上拉4.开发给打一个压缩包,rz上去.解压 传统部署缺点:1.全程运维参与,占用大量时间2.上线速 ...
- Linux下安装CollabNetSubversionEdge
1.首先下载CollabNet Subversion,目前最新版本Subversion Edge 5.2.2 (Linux 64-bit),注意下载的时候需要注册下账号,才允许下载: 2.安装Coll ...