这道题目我用一般线段树写,发现超时了,后来用结构体,就过了,于是才知道结构体速度会快好多!代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
const int maxn=50005;
const int D=1000000007;
__int64 a[maxn];
using namespace std;
struct node
{
int l,r;
long long sum;
}root[4*maxn];
void build(int u,int l,int r)
{
root[u].l=l;
root[u].r=r;
if(l==r)
{
root[u].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;
}
void update(int u,int l,int r,int pos,int tre)
{
if(root[u].l==root[u].r&&root[u].l==pos)
{
root[u].sum=tre;
return ;
}
int mid=(l+r)>>1;
if(pos<=mid)update(2*u,l,mid,pos,tre);
else update(2*u+1,mid+1,r,pos,tre);
root[u].sum=(root[2*u].sum*root[2*u+1].sum)%D;
}
long long query(int u,int l,int r,int tl,int tr)
{
if(root[u].l>=tl&&root[u].r<=tr)
{
return root[u].sum;
}
int mid=(l+r)>>1;
if(tr<=mid) query(2*u,l,mid,tl,tr);
else if(tl>mid) query(2*u+1,mid+1,r,tl,tr);
else
{
__int64 t1=query(2*u,l,mid,tl,mid);
__int64 t2=query(2*u+1,mid+1,r,mid+1,tr);
return (t1*t2)%D;
}
}
int main()
{
int t,n,i,p,b,c,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%I64d",&a[i]);
build(1,1,n);
scanf("%d",&p);
for(i=0; i<p; i++)
{
scanf("%d%d%d",&k,&b,&c);
if(k==0)
{
__int64 ans;
ans=query(1,1,n,b,c);
printf("%I64d\n",ans);
}
else if(k==1)
{
update(1,1,n,b,c);
}
}
}
return 0;
}
HDU 3074
最新推荐文章于 2020-02-07 11:05:28 发布