题目描述:

问题描述
有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. 关系数据库(MySQL)的规范化、以及设计原则

    1.了解范式(NF) 为了使得关系数据库能够符合规范理论,所有的数据库表都要满足:范式. 关系数据库的范式有五类:第一范式,第二范式,....第五范式.下面我们来了解一下前三个范式: 第一范式:简单来 ...

  2. Python之路PythonNet,第四篇,网络4

    pythonnet   网络4 select  支持水平触发 poll       支持水平触发 epoll epoll 也是一种IO多路复用的方式,效率比select和poll 要高一点: epol ...

  3. ldd 查看程序依赖库

    ldd 查看程序依赖库 https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html

  4. 纯C:url base64

    纯代码,来自互联网 base64.h #ifndef __BASE64_H__ #define __BASE64_H__ #ifdef __cplusplus extern "C" ...

  5. transition的用法以及animation的用法

    http://www.cnblogs.com/xiaohuochai/p/5347930.html transiton: 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间: 触发过渡 单纯的代码不 ...

  6. CSS3动画那么强,requestAnimationFrame还有毛线用

    http://www.zhangxinxu.com/wordpress/2013/09/css3-animation-requestanimationframe-tween-%E5%8A%A8%E7% ...

  7. HPU组队赛B:问题(二进制枚举)

    时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...

  8. <<操作,&0xff以及|的巧妙运用(以POJ3523---The Morning after Halloween(UVa 1601)为例)

    <<表示左移,如a<<1表示将a的二进制左移一位,加一个0,&0xff表示取最后8个字节,如a&0xff表示取a表示的二进制中最后8个数字组成一个新的二进制数, ...

  9. Ubuntu下一个好用的终端

    在终端下输入: sudo apt-get install terminator 快捷键: shift+ctrl+e          在当前窗口右侧新开一个窗口 shift+ctrl+w        ...

  10. pycharm汉化 (ubuntu版)

    终端依次输入 cd  /tmp git clone https://github.com/ewen0930/PyCharm-Chinese cd Pycharm-Chinese bash packag ...