hdu 3074 Multiply game (线段树)

本题求的是一个区间段的积,要及时更新区间的数,与hdu 1166 敌兵布阵 差不多,


1166这题只是求得是区间段的和,并没有要求更新区间的数!由于本题是数之间的乘积,故数会非常大的,故需用 long long,

嘿嘿····,俺用int直接wrong了!我囧!!!貌似这是废话哦!嘿嘿·····


刚学线段树,好多内容都不会!

大神莫见怪!


俺乡村小伙没见过大世面!!!

嘎嘎嘎······

#include<stdio.h>

#define N 50010
#define MAX 1000000007
struct node
{
int x,y;
__int64 ji;
}aa[N*3];


int num[N];


__int64 CreatTree(int t,int x,int y)
{
aa[t].x=x;
aa[t].y=y;
if(x==y)
{
return aa[t].ji=num[x];
}
int temp=2*t;
int mid=(x+y)/2;
return aa[t].ji=CreatTree(temp,x,mid)*CreatTree(temp+1,mid+1,y)%MAX;
}


void UpdateTree(int t,int i,int j)
{
if(i==aa[t].x&&i==aa[t].y)
{
aa[t].ji=j;
return ;
}
int temp=2*t;
int mid=(aa[t].x+aa[t].y)/2;
if(i<=mid)
UpdateTree(temp,i,j);
else
UpdateTree(temp+1,i,j);
aa[t].ji=aa[temp].ji*aa[temp+1].ji%MAX;
return;
}


__int64 FindTree(int t,int x,int y)
{
if(aa[t].x==x&&aa[t].y==y)
return aa[t].ji;
int temp=2*t;
int mid=(aa[t].x+aa[t].y)/2;
if(y<=mid)
return FindTree(temp,x,y);
else if(x>mid)
return FindTree(temp+1,x,y);
else
return FindTree(temp,x,mid)*FindTree(temp+1,mid+1,y)%MAX;
}


int main()
{
int T,m,n,k,x,y,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
CreatTree(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&k,&x,&y);
if(k==0)
printf("%I64d\n",FindTree(1,x,y));
else
{
UpdateTree(1,x,y);

}
}
}
return 0;
}



题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3074

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值