c语言蓝桥杯的操作格子我用了提示的线段树求解但是为什么运行还是超时呢?请大家帮帮忙!谢谢!
问题描述
有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;
}
有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;
}
...全文
相关推荐
蓝桥杯18年最全算法训练试题181道(含vip试题)
1.2018年12月整理,题目最新最全(181道)。 2.每个题目都有目录,方便查询。 3.包含所有VIP试题。
15届蓝桥杯知识点大纲
15届蓝桥杯知识点大纲
.archivetemp第十五届蓝桥杯大赛(软件赛)C&C++和Java组竞赛规则及说明.pdf
.archivetemp第十五届蓝桥杯大赛(软件赛)C&C++和Java组竞赛规则及说明.pdf
文档蓝桥杯练习系统题目汇总含解析
文档蓝桥杯练习系统题目汇总含解析
十二届蓝桥杯程序设计题最新答案
代码转载自:https://pan.quark.cn/s/63339f2841c3 "蓝桥杯"练习题解 "蓝桥杯"练习系统 测试数据下载 概览 试题集 入门训练 基础练习 算法训练



