双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

c语言蓝桥杯的操作格子我用了提示的线段树求解但是为什么运行还是超时呢?请大家帮帮忙!谢谢!

c语言爱好者嘻嘻 c语言爱好者嘻嘻 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
问题描述
有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。
#include<stdio.h>
#include<stdlib.h>
typedef struct caozuo
{
int p;
int x;
int y;
}cao_zuo;
typedef struct shu
{
int zuo;
int you;
int max;
int sum;
struct shu *_zuo,*_you;
}_shu;
void chuangjian(_shu **geng,int *x,int zuo1,int you1)
{
*geng=(_shu*)malloc(sizeof(_shu));
(*geng)->zuo=zuo1;
(*geng)->you=you1;
if(zuo1==you1)
{
(*geng)->max=x[zuo1-1];
(*geng)->sum=x[zuo1-1];
(*geng)->_zuo=NULL;
(*geng)->_you=NULL;
}
else if(zuo1<=you1)
{
chuangjian(&((*geng)->_zuo),x,zuo1,(zuo1+you1)/2);
chuangjian(&((*geng)->_you),x,(zuo1+you1)/2+1,you1);
(*geng)->max=(*geng)->_zuo->max>(*geng)->_you->max?(*geng)->_zuo->max:(*geng)->_you->max;
(*geng)->sum=(*geng)->_zuo->sum+(*geng)->_you->sum;
}
}
int fda(_shu **geng,int zuo1,int you1)
{
int da;
if(zuo1<=(*geng)->zuo&&(*geng)->you<=you1)
{
da=(*geng)->max;
}
else
{
if(zuo1<=((*geng)->zuo+(*geng)->you)/2)
{
da=fda(&((*geng)->_zuo),zuo1,you1);
}
if(((*geng)->zuo+(*geng)->you)/2+1<=you1)
{
da=fda(&((*geng)->_you),zuo1,you1);
}
if(zuo1<=((*geng)->zuo+(*geng)->you)/2&&((*geng)->zuo+(*geng)->you)/2+1<=you1)
{
da=fda(&((*geng)->_zuo),zuo1,you1)>fda(&((*geng)->_you),zuo1,you1)?fda(&((*geng)->_zuo),zuo1,you1):fda(&((*geng)->_you),zuo1,you1);
}
}
return da;
}
int fsum(_shu **geng,int zuo1,int you1)
{
int s=0;
if(zuo1<=(*geng)->zuo&&(*geng)->you<=you1)
{
s+=(*geng)->sum;
}
else
{
if(zuo1<=((*geng)->zuo+(*geng)->you)/2)
s+=fsum(&((*geng)->_zuo),zuo1,you1);
if(((*geng)->zuo+(*geng)->you)/2+1<=you1)
s+=fsum(&((*geng)->_you),zuo1,you1);
}
return s;
}
void fxiu(_shu **geng,int x1,int y1)
{
if((*geng)->zuo==(*geng)->you)
{
(*geng)->sum=y1;
(*geng)->max=y1;
}
else
{
if(x1<=((*geng)->zuo+(*geng)->you)/2)
fxiu(&((*geng)->_zuo),x1,y1);
if(x1>=((*geng)->you+(*geng)->zuo)/2+1)
fxiu(&((*geng)->_you),x1,y1);
(*geng)->sum=(*geng)->_zuo->sum+(*geng)->_you->sum;
(*geng)->max=(*geng)->_zuo->max>(*geng)->_you->max?(*geng)->_zuo->max:(*geng)->_you->max;
}
}
int main()
{
int n,m,*yuanshu,i;
cao_zuo *cao;
_shu *xianduanshu;
scanf("%d%d",&n,&m);
yuanshu=(int*)malloc(n*sizeof(int));
cao=(cao_zuo*)malloc(m*sizeof(cao_zuo));
for(i=0;i<n;i++)
scanf("%d",&yuanshu[i]);
for(i=0;i<m;i++)
scanf("%d%d%d",&cao[i].p,&cao[i].x,&cao[i].y);
chuangjian(&xianduanshu,yuanshu,1,n);
for(i=0;i<m;i++)
{
switch(cao[i].p)
{
case 1:fxiu(&xianduanshu,cao[i].x,cao[i].y);break;
case 2:printf("%d\n",fsum(&xianduanshu,cao[i].x,cao[i].y));break;
case 3:printf("%d\n",fda(&xianduanshu,cao[i].x,cao[i].y));break;
}
}
return 0;
}
...全文
评论 7
收藏 已收藏
分享
返回顶部
c语言爱好者嘻嘻
C语言 70,039 成员 243,237 内容