题目描述:

问题描述
有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.算法训练_操作格子的更多相关文章

  1. 蓝桥杯-算法训练--ALGO-8 操作格子

    问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求 ...

  2. 蓝桥杯练习系统— 算法训练 Beaver's Calculator

    问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...

  3. 蓝桥杯练习系统算法训练习题加答案java版本

    附上百度文库的链接:http://wenku.baidu.com/view/afb78d36b42acfc789eb172ded630b1c59ee9bf7

  4. ALGO-143_蓝桥杯_算法训练_字符串变换

    问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,,,,5这5个参数分别指代不同的5种字符串操作, ...

  5. [蓝桥杯]ALGO-122.算法训练_未名湖边的烦恼

    问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...

  6. [蓝桥杯]ALGO-92.算法训练_前缀表达式

    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法).“-”(减法).“*”(乘法)或“/”(除法),运算对象为 ...

  7. [蓝桥杯]ALGO-79.算法训练_删除数组零元素

    从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...

  8. ALGO-6_蓝桥杯_算法训练_安慰奶牛

    记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include ...

  9. ALGO-5_蓝桥杯_算法训练_最短路

    记: 一开始没接触过关于最短距离的算法,便开始翻阅关于图的知识, 得知关于最短距离的算法有Dijkstra算法(堆优化暂未看懂),Bellman-Ford算法,Floyd算法,SPFA算法. 由于数据 ...

随机推荐

  1. 2017-2018-1 20155219《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155320<信息安全技术>实验二--Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验 ...

  2. 牛客国庆集训派对Day1-C:Utawarerumono(数学)

    链接:https://www.nowcoder.com/acm/contest/201/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  3. 51Nod 1459:迷宫游戏(最短路)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  4. 《DSP using MATLAB》Problem 6.20

    先放子函数: function [C, B, A, rM] = dir2fs_r(h, r); % DIRECT-form to Frequency Sampling form conversion ...

  5. 用java的io流,将一个文本框的内容反转

    import java.io.*; import java.util.ArrayList; public class test04 { public static void main(String a ...

  6. 【maven】maven源码打包

    1.打包时附加外部Jar包 <!--编译+外部 Jar打包-->          <plugin>            <artifactId>maven-co ...

  7. day43 数据库学习egon的博客 索引

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  8. Singer 学习六 运行&&开发taps、targets (一 taps 运行说明)

    文章内容来来自官方github 说明: singer大部分的taps && targets 是用python编写的,所以内容里面的代码也是使用python 编写 使用python运行s ...

  9. windows删除文件或目录CMD命令

    rd/s/q 盘符:\某个文件夹  (强制删除文件文件夹和文件夹内所有文件)del/f/s/q 盘符:\文件名  (强制删除文件,文件名必须加文件后缀名)

  10. Docker和Rancher

    Docker打包流程: Dockerfile文件和要打包docker的文件放在同级目录下: 1. docker build -t proj:proj-app:0.0.1 返回tagXXX 2. doc ...