本题求的是一个区间段的积,要及时更新区间的数,与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